首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle 11g自动索引字段是否经常用于全表扫描?

Oracle 11g自动索引字段是否经常用于全表扫描?
EN

Stack Overflow用户
提问于 2010-05-29 16:26:46
回答 6查看 3.5K关注 0票数 1

我有一个使用Oracle 11g数据库的应用程序。我有一个相当大的表(~50k行),因此我查询:

代码语言:javascript
复制
SELECT omg, ponies FROM table WHERE x = 4

我发现,字段x没有被索引。这个查询经常发生,但问题是性能并不差。在x上添加索引确实使查询速度提高了一倍,这比我预期的要低得多。在MySQL上,它至少可以使查询速度提高十倍。(编辑:,我在MySQL上做了测试,发现了一个巨大的不同。)

当Oracle检测到我经常查询非索引字段时,我怀疑Oracle添加了某种自动索引。我说的对吗?我在文档里连暗示都找不到。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-05-30 00:13:31

如前所述,Oracle11g不根据先前的经验动态构建索引。当然,在正确的条件下添加一个指数会产生你注意到的数量级的改善,这是可能的,而且确实经常发生。

但正如已经指出的,50K (似乎很短?)行对Oracle来说不算什么。事实上,Oracle数据库拥有大量的智能,可以在没有索引的情况下对数据进行最有效的扫描。Oracle RDBMS的每一个新版本都能更好地移动大量数据。我想向您建议,即使没有索引(与MySQL相比),甲骨文之所以如此接近它的“最佳”时机,是因为甲骨文只是一个隐藏的更智能的数据库。

但是,Oracle RDBMS确实有许多与您打开的主题区域有关的特性。例如:

10g引入了一个名为自动SQL调优的特性,它是通过名为SQL调优顾问的gui公开的。此特性旨在深入分析查询本身,并包括对替代查询计划进行分析的能力。这包括模拟实际上不存在的索引。但是,这并不能解释您所看到的任何性能差异,因为特性需要打开,而且它实际上并不构建任何索引,它只为DBA提供了创建索引的建议。

11g包括自动统计数据收集,一旦启用,将根据对这些对象的活动自动收集其认为必要的数据库对象统计数据。

因此,Oracle RDBMS正在按照您的建议进行操作,根据其随时间推移的工作负载经验,自行动态地更改其环境,以提高性能。动态创建索引只是还没有做到的事情之一。顺便说一句,甲骨文在私人场合暗示过这一点,所以我认为它正在为将来的发行做准备。

票数 5
EN

Stack Overflow用户

发布于 2010-05-29 16:50:58

Oracle 11g自动索引字段是否经常用于全表扫描?

不是的。

票数 1
EN

Stack Overflow用户

发布于 2010-05-29 17:28:19

“在x上添加索引确实使查询速度提高了一倍,这比我预期的要小得多。在MySQL上,它至少可以使查询速度提高十倍。”

X有多少不同的值?它们是聚集在桌子的一个部分,还是均匀地分布在整个桌子上?

指数不是什么巫毒装置:它们必须遵守物理定律。

编辑

“重复的东西可能会出现,但实际上没有。”

如果该列既没有唯一约束,也没有唯一索引,优化器将根据该列中可能存在重复值而选择执行路径。这就是尽可能准确地声明数据模型的价值:向优化器提供元数据。在这方面,保持最新的统计数字也非常有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2935782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档