我们有一个应用程序生成一些临时表,然后处理数据。我没有真正控制应用程序创建这个和后续查询的方式。我们注意到的是,Oracle使用全表扫描而不是使用作为表的主键的索引。如果它使用主键索引,则进程将运行得更快。强制Oracle在不使用提示的情况下使用主键索引
由于我无法控制应用程序生成的选择查询,因此我无法使用提示并强制Oracle使用主键索引。是否还有其他设置可以在某处强制Oracle使用临时表的主键索引?
我们有一个应用程序生成一些临时表,然后处理数据。我没有真正控制应用程序创建这个和后续查询的方式。我们注意到的是,Oracle使用全表扫描而不是使用作为表的主键的索引。如果它使用主键索引,则进程将运行得更快。强制Oracle在不使用提示的情况下使用主键索引
由于我无法控制应用程序生成的选择查询,因此我无法使用提示并强制Oracle使用主键索引。是否还有其他设置可以在某处强制Oracle使用临时表的主键索引?
用于查询的两个最常见的理由不使用索引:
如果您的查询选择了全部表格或进行连接而未提及where子句中的主键等,那么进行全面扫描可能会更快。没有查询和索引,最好还有解释计划,因此无法确定。
然而,我会建议你让你的DBA重新收集 - 我希望,如果不是第一次收集的话 - 统计数据。使用dbms_stats.gather_table_stats
,估计百分比为25%+。
如果每次运行应用程序时都重新创建表,则在创建和主键生成后尝试收集统计信息。如果它们每次都被截断并重新填充,那么请您的DBA重新构建它们和PK,然后收集统计数据,因为这可能会显着增加查询运行时间。
无法控制任何事情,我没有看到如何以任何其他方式提高查询时间。
通过利用SQL配置文件,您可以在不更改SQL的情况下使用提示。将你的提示包装到一个SQL配置文件中,该配置文件对该特定的SQL ID生效。
我明白你没有控制SQL,我有很多应用程序,我遇到同样的限制。在检查了Ben的帖子中的查询结构和统计信息之后,你已经证明,使用索引提示会提高性能,为什么不尝试手动创建SQL配置文件。
Christian Antognini有一篇关于SQL Profiles的文章here,并且手动创建它们。该文件提到手动创建SQL配置文件是未记录的。我同意没有文件,但这并不意味着不受支持。我会说那里几乎没有文档,但是如果您想要证明Oracle允许手动创建,请检查API或查看SQLT实用程序目录中的coe_xfr_sql_profile.sql文件。
我还发布了关于如何快速手动创建SQL配置文件here的备忘单。
非常感谢。这篇文章非常有帮助。我会研究这一点 – Eosphorus 2011-12-29 16:08:49
你可以添加一列,它会有自动递增序列,并将该列设置为主键列 – 2011-12-28 21:48:25
我更像是一个MSSQL人,但是强制查询的唯一方法是通过提示。从你的措辞来看,你是否能控制临时表的创建并不清楚。你确定PK正在创建?如果存在PK/FK关系,那么它们是被声明的(在MSSQL中,查询优化器使用这种关系)?逻辑上,我从来没有使用PK的查询。 – Paparazzi 2011-12-28 21:51:00
@BalamBalam我无法控制临时表的创建。但是我们确实检查了PK是否正在创建。我不知道为什么查询优化器不使用这个和它的一个奇怪的问题,因为我不能添加任何提示的查询。 – Eosphorus 2011-12-28 22:04:23