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

gus*_*afc 1 oracle indexing

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

SELECT omg, ponies FROM table WHERE x = 4
Run Code Online (Sandbox Code Playgroud)

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

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

小智 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正在按照您的建议进行操作,根据其随时间推移的工作负载经验自动动态更改其环境,以提高性能.即时创建索引并不是其中之一.顺便说一句,甲骨文在私下的时间里已经暗示了这一点,所以我认为它正在为将来的版本发布.