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

时间:2010-05-29 16:26:46

标签: oracle indexing

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

SELECT omg, ponies FROM table WHERE x = 4
我发现

字段x没有编入索引。这个查询发生在一个很多,但问题是性能并不是太糟糕。在x上添加索引确实使查询大约快了两倍,这远远低于我的预期。比方说,MySQL,它至少会使查询速度提高十倍。 (编辑:我在MySQL上测试了这个,并且看到了巨大的差异。)

我怀疑Oracle在检测到我经常查询非索引字段时会添加某种自动索引。我对么?在文档中我甚至都没有发现任何暗示。

6 个答案:

答案 0 :(得分:5)

正如已经指出的那样,Oracle11g不会根据以前的经验动态构建索引。当然有可能并且确实经常发生在正确条件下添加索引将产生您注意到的数量级改进。

但正如已经注意到的那样,50K(看似简短?)行对Oracle来说并不算什么。事实上,Oracle数据库具有很强的智能,可以最有效地扫描没有索引的数据。 Oracle RDBMS的每个新版本都可以更好地移动大量数据。我建议你,即使没有与MySQL相比索引,甲骨文如此接近其“最佳”时机的原因是甲骨文只是一个更智能的数据库。

但是,Oracle RDBMS确实有很多功能可以触及您打开的主题区域。例如:

10g引入了一个名为AUTOMATIC SQL TUNING的功能,它通过一个名为SQL TUNING ADVISOR的gui公开。此功能旨在深入分析查询,并包括对备用查询计划进行WHAT-IF分析的功能。这包括模拟实际上不存在的索引。但是,这并不能解释您所看到的任何性能差异,因为需要打开该功能并且它实际上并不构建任何索引,它只是建议DBA制作索引等等。

11g包括AUTOMATIC STATISTICS GATHERING,当启用时,它将根据对这些对象的活动自动收集数据库对象的统计信息。

因此,Oracle RDBMS正在按照您的建议进行操作,根据其对工作负载的经验,随着动态改变其环境,以提高性能。即时创建索引并不是其中之一。顺便说一下,甲骨文在私下的时间里已经暗示了这一点,所以我认为它正在为未来的发布做准备。

答案 1 :(得分:1)

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

  

没有

答案 2 :(得分:1)

  

“在x上添加索引确实可以实现   查询大约快两倍,   这远远低于我的预期。上,   比方说,MySQL,它会进行查询   至少快了十倍。“

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

索引不是一些伏都教设备:它们必须遵守物理定律。

修改

  

“可能会出现重复,但就像它一样   是的,没有。“

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

答案 3 :(得分:1)

关于MySQL问题,您使用的存储引擎可能会有所作为。

"MyISAM relies on the operating system for caching reads and writes to the data rows while InnoDB does this within the engine itself"

Oracle将缓存表/数据行,因此不需要访问磁盘。根据操作系统和硬件的不同,MySQL MyISAM每次都必须从磁盘上物理读取数据。

答案 4 :(得分:1)

~50K行,很大程度上取决于每行的大小,可以想象地存储在1000个以下的块中,这可以通过50个多块读取中的全表扫描(FTS)快速读入缓冲区高速缓存。

当数据量和/或访问频率上升时,添加适当的索引将允许表格上的查询顺利扩展。

答案 5 :(得分:0)

在创建索引之前和之后,您应该查看查询的估计执行计划。 (另外,请确保您的桌面上的统计信息是最新的。)这将告诉您究竟发生了什么以及为什么性能就是这样。

50k行并不是一张桌子那么大,所以即使没有索引,如果表现还不错,我也不会感到惊讶。因此,将索引添加到等式中并不能真正为查询执行速度带来很大改进。