强制Oracle使用主键索引而不使用提示

强制Oracle使用主键索引而不使用提示,oracle,optimization,indexing,primary-key,Oracle,Optimization,Indexing,Primary Key,我们有一个应用程序,它生成一些临时表,然后处理数据。我真的无法控制应用程序创建此查询和后续查询的方式。我们注意到Oracle使用了完整的表扫描,而不是使用作为表主键的索引。如果它使用主键索引,进程将运行得更快 由于我无法控制应用程序生成的select查询,因此无法使用提示并强制Oracle使用主键索引。我是否可以在其他地方更改任何设置,以强制Oracle对临时表使用主键索引 查询不使用索引的两个最常见原因是: 进行全表扫描更快 糟糕的统计数字 如果您的查询选择了所有的表或执行连接,而没有在whe

我们有一个应用程序,它生成一些临时表,然后处理数据。我真的无法控制应用程序创建此查询和后续查询的方式。我们注意到Oracle使用了完整的表扫描,而不是使用作为表主键的索引。如果它使用主键索引,进程将运行得更快


由于我无法控制应用程序生成的select查询,因此无法使用提示并强制Oracle使用主键索引。我是否可以在其他地方更改任何设置,以强制Oracle对临时表使用主键索引

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

  • 进行全表扫描更快
  • 糟糕的统计数字
  • 如果您的查询选择了所有的表或执行连接,而没有在where子句等中提及主键,那么执行完全扫描可能会更快。如果没有查询和索引,最好还有一个解释计划,就不可能确切地说出来

    但是,我建议您让DBA重新收集表上的统计数据——我希望,如果不是第一次收集的话。使用,估计百分比为25%+

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


    由于无法控制任何内容,我看不出如何以任何其他方式提高查询时间。

    通过利用SQL配置文件,您可以在不更改SQL的情况下使用提示。将提示包装到对特定SQL ID生效的SQL配置文件中

    我知道你无法控制SQL,我有很多应用程序遇到同样的限制。在Ben的文章中检查了查询结构和统计数据之后,您已经证明暗示使用索引将提高性能,为什么不尝试手动创建SQL概要文件呢

    克里斯蒂安·安托格尼尼(Christian Antognini)有一篇关于SQL概要文件和手动创建它们的伟大论文。本文提到手动创建SQL概要文件是没有文档记录的。我同意无文件记录,但这并不一定意味着不受支持。我想说的是,文档很少,但是如果您想证明Oracle允许手动创建,请检查API或查看实用程序目录中的coe_xfr_sql_profile.sql文件


    我还发布了一份关于如何快速手动创建SQL配置文件的备忘单

    你能不能再添加一个具有自动递增序列的列,并将该列设置为主键列我更喜欢MSSQL,但强制查询的唯一方法是通过提示。从您的措辞来看,不清楚您是否可以控制临时表的创建。您确定正在创建PK吗?如果存在PK/FK关系,那么它们是否被声明(在MSSQL中,查询优化器使用此关系)?我从来没有一个查询在逻辑上不使用PK。@BalamBalam我无法控制临时表的创建。然而,我们确实进行了检查,以确保PK被创建。我不知道为什么查询优化器没有使用此选项,这是一个奇怪的问题,因为我无法向查询添加任何提示。@Emmanuel N我无法控制新表的创建,不幸的是,我无法添加另一列。它们是否加入到您可以控制的表中?确保您所控制的表已正确索引,且未分段。确保他们正在建立统计数据。您可以使用自己控制的表来构建统计信息。我怀疑这会解决任何问题,但它可能不会破坏任何东西。
    由于无法控制任何东西,我不知道如何以任何其他方式提高查询时间。
    ->。也许收集整个模式的统计数据也更好。@Sathya,是的,我想是这样。我回答了一个使用某些表的查询,但是如果统计数据收集得不好,那么在任何地方都值得这样做。统计数据是为模式中的其他表收集的。应用程序创建临时表,使用它们,并在过程结束时删除它们,因此收集统计数据可能是一个问题。嗯,我想没有办法改善查询时间。@Eosphorus,有很多方法可以改善查询,但它们都需要你对正在发生的事情有某种“能力”。如果要在应用程序的中间添加一个聚集统计信息,那么我一定会尝试;它不应该伤害任何东西,也可以大大地改善它。@ Eosphorus,你也可以考虑增加动态采样水平:非常感谢。这篇文章非常有帮助。我会调查的