代码之家  ›  专栏  ›  技术社区  ›  gustafc

Oracle11g是否自动索引经常用于全表扫描的字段?

  •  1
  • gustafc  · 技术社区  · 14 年前

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

    SELECT omg, ponies FROM table WHERE x = 4
    

    x 我发现没有被索引。此查询发生在 许多 但问题是表现还不错。在上添加索引 X 查询速度大约是我预期的两倍,远远低于我的预期。比如说,在MySQL上,它至少可以使查询速度快十倍。( 编辑: 我在mysql上做了测试,发现有很大的不同。)

    我怀疑Oracle在检测到我经常查询非索引字段时会添加某种自动索引。我说的对吗?我在医生那里找不到任何暗示。

    6 回复  |  直到 14 年前
        1
  •  5
  •   Kevin Meade    14 年前

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

    但正如已经指出的,50K(似乎很短?)行与Oracle无关。事实上,Oracle数据库具有大量的智能,可以最有效地扫描没有索引的数据。Oracle RDBMS的每一个新版本都能更好地移动大量数据。我建议您,与MySQL相比,即使没有索引,Oracle也非常接近它的“最佳”时间,这是因为Oracle只是一个更智能的数据库。

    然而,Oracle RDBMS确实有许多与您打开的主题区域相关的功能。例如:

    10G引入了一个称为自动SQL调优的功能,该功能通过一个名为SQL调优顾问的GUI公开。此功能旨在单独深入分析查询,并包括对可选查询计划进行假设分析的能力。这包括模拟实际不存在的索引。但是,这并不能解释您所看到的任何性能差异,因为该特性需要打开,并且实际上它不构建任何索引,它只建议DBA创建索引等。

    11g包括自动统计收集,启用后,将根据这些对象上的活动自动收集数据库对象的统计信息。

    因此,Oracle RDBMS正在按照您的建议进行操作,根据自己对工作负载的经验,动态地改变其环境,以提高性能。动态创建索引还不是目前的工作之一。顺便提一句,这是Oracle在私人七年时代暗示的,所以我认为它正在为将来的发布工作。

        2
  •  1
  •   cagcowboy    14 年前

    Oracle11g是否自动索引经常用于全表扫描的字段?

    不。

        3
  •  1
  •   Gary Myers    14 年前

    在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
  •   Jeffrey Kemp    14 年前

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

    添加适当的索引将允许表上的查询随着数据量和/或访问频率的增加而平滑地扩展。

        5
  •  1
  •   APC    14 年前

    “在X上添加索引确实使 查询速度大约是查询速度的两倍, 比我想象的要少得多。在, 比如说,MySQL,它会进行查询 至少要快十倍。”

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

    索引不是巫毒装置:它们必须遵守物理定律。

    编辑

    “可能会出现重复,但 是的,没有。”

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

        6
  •  0
  •   Tommi    14 年前

    在创建索引之前和之后,您应该查看查询的估计执行计划。(另外,确保统计数据在您的表中是最新的。)这将告诉您到底发生了什么,为什么性能就是它。

    50K行不是一个表那么大,所以即使没有索引,如果性能还不错,我也不会感到惊讶。因此,在公式中添加索引并不能真正提高查询的执行速度。