强制Oracle在不使用提示的情况下使用主键索引

Eos*_*rus 3 oracle indexing optimization primary-key

我们有一个应用程序,它生成一些临时表,然后处理数据.我真的无法控制应用程序创建它的方式以及后续的查询.我们注意到Oracle使用全表扫描而不是使用索引作为表的主键.如果它使用主键索引,则进程运行速度会快很多.

由于我无法控制应用程序生成的选择查询,因此无法使用提示并强制Oracle使用主键索引.是否有任何其他设置我可以在某处更改可能会强制Oracle使用临时表的主键索引?

Ben*_*Ben 6

查询不使用索引的两个最常见原因是:

  1. 进行全表扫描更快.
  2. 统计不佳.

如果您的查询选择了所有表或正在进行连接而没有在where子句等中提及主键,那么进行全面扫描的可能性会更快.没有查询和索引,最好是解释计划,也无法确定.

但是,我会建议你让你的DBA重新聚集 - 我希望,如果不是第一次聚集 - 桌面上的统计数据.使用dbms_stats.gather_table_stats,估计百分比为25%+.

如果每次运行应用程序时都重新创建表,则在创建和生成主键后尝试收集统计信息.如果它们每次都被截断并重新填充,那么请让DBA重建它们和PK,然后收集统计信息,因为这可能会显着增加查询运行时间.

由于无法控制任何事情,我不知道如何以其他方式改善查询时间.