我们有一个应用程序可以生成一些临时表,然后处理数据。我真的无法控制应用程序创建它的方式以及后续的查询。我们注意到Oracle使用全表扫描而不是使用索引作为表的主键。如果它使用主键索引,则进程运行速度会快很多。
由于我无法控制应用程序生成的选择查询,因此无法使用提示并强制Oracle使用主键索引。是否有任何其他设置我可以在某处更改可能会强制Oracle使用临时表的主键索引?
答案 0 :(得分:6)
查询不使用索引的两个最常见原因是:
如果您的查询选择了所有表或正在进行连接而没有在where子句等中提及主键,那么进行全面扫描的可能性会更快。没有查询和索引,最好是解释计划,也无法确定。
但是,我会建议你让你的DBA重新聚集 - 我希望,如果不是第一次聚集 - 桌面上的统计数据。使用dbms_stats.gather_table_stats
,估算百分比为25%+。
如果每次运行应用程序时都重新创建表,则在创建和生成主键后尝试收集统计信息。如果它们每次都被截断并重新填充,那么请让DBA重建它们和PK,然后收集统计信息,因为这可能会显着增加查询运行时间。
由于无法控制任何事情,我不知道如何以其他方式改善查询时间。
答案 1 :(得分:2)
您可以通过利用SQL配置文件在不更改SQL的情况下使用提示。将提示包装到对该特定SQL ID生效的SQL配置文件中。
我知道你无法控制SQL,我有很多应用程序遇到同样的限制。在检查了Ben的帖子中的查询结构和统计信息后,您已经证明提示使用索引将提高性能,为什么不尝试手动创建的SQL配置文件。
Christian Antognini有一篇关于SQL配置文件的精彩论文here并手动创建它们。本文提到手动创建SQL配置文件没有记录。我同意无证,但这并不一定意味着没有人支持。我想说那里的文档很少,但是如果你想证明Oracle允许手动创建,请检查API或查看SQLT实用程序目录中的coe_xfr_sql_profile.sql文件。
我还发布了一个关于如何快速手动创建SQL配置文件here的备忘单。