强制oracle使用索引

强制oracle使用索引,oracle,Oracle,有没有办法强迫oracle使用除提示之外的索引?没有。如果优化器不使用索引,通常会有很好的理由。如果索引不好,索引使用实际上会减慢查询速度。如果查询的条件中没有包含索引字段,那么DB使用索引将是愚蠢的。因此,我支持Donnie的回答。Oracle认为索引是可用的,但不使用索引 残废 无效(例如,在大量数据加载后,有关索引的统计信息尚未更新) 不会有帮助(例如,当500万行中只有两个不同的值时) 因此,首先要检查的是索引是否已启用,然后在索引/表/模式上运行。如果这样做没有帮助,Oracle认

有没有办法强迫oracle使用除提示之外的索引?

没有。如果优化器不使用索引,通常会有很好的理由。如果索引不好,索引使用实际上会减慢查询速度。

如果查询的条件中没有包含索引字段,那么DB使用索引将是愚蠢的。因此,我支持Donnie的回答。

Oracle认为索引是可用的,但不使用索引

  • 残废
  • 无效(例如,在大量数据加载后,有关索引的统计信息尚未更新)
  • 不会有帮助(例如,当500万行中只有两个不同的值时)

因此,首先要检查的是索引是否已启用,然后在索引/表/模式上运行。如果这样做没有帮助,Oracle认为加载索引实际上要比加载实际行值花费更多的时间。在这种情况下,向索引中添加更多的列,使其看起来更“多样化”。

您可以查看oracle存储的大纲。您可以获取现有查询并创建存储的大纲,然后像提示一样调整查询。它只是很难使用。在决定实施存储的大纲之前,请进行一些研究

您可以向查询中添加提示,使其在一个索引上的外观优于另一个索引


一般来说,如果您收集了所有表和索引的良好统计数据,Oracle通常会执行非常好的执行计划。

是的,从技术上讲,您可以强制Oracle使用索引(无提示),在一种情况下:如果表是索引组织的表,从逻辑上讲,查询表的唯一方法是通过其索引,因为没有要查询的表。

gather命令是存储过程。请参阅数据库工具的文档,了解如何调用它们。在JDBC中,尝试调用dbms.dbms\u stats.gather\u table\u stats('user','table')。从sql*plus开始,尝试
exec dbms…
Hey Degulla,我很想知道的是,GATHER和analysis命令的基本用法是什么,以及强制在表上建立索引是如何有用的?它不强制Oracle使用索引。但是当没有索引并且你确信它应该使用它时,通常是因为统计数据已经过时了。Oracle会在更改表后更新统计数据,但每天只更新一次(或管理员配置的数据)。因此,在多次更改之后,Oracle会认为索引不再好,并将停止使用它。然后,您可以手动运行gather命令来更新统计数据,索引将再次变为“良好”。Donnie,那么有什么方法可以强制oracle使用索引呢?您不能。这就是我说“不”的原因。如果您认为索引足够好,应该使用它,请参阅@Arron的答案。除此之外,如果提示没有让它使用它,那么该索引就不值得使用。它可以是一个覆盖索引,也可以用于避免由于ORDER BY而进行排序。所以这不仅仅是条件的问题。