2011-12-28 44 views
3

我们有一个应用程序生成一些临时表,然后处理数据。我没有真正控制应用程序创建这个和后续查询的方式。我们注意到的是,Oracle使用全表扫描而不是使用作为表的主键的索引。如果它使用主键索引,则进程将运行得更快。强制Oracle在不使用提示的情况下使用主键索引

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

+0

你可以添加一列,它会有自动递增序列,并将该列设置为主键列 – 2011-12-28 21:48:25

+0

我更像是一个MSSQL人,但是强制查询的唯一方法是通过提示。从你的措辞来看,你是否能控制临时表的创建并不清楚。你确定PK正在创建?如果存在PK/FK关系,那么它们是被声明的(在MSSQL中,查询优化器使用这种关系)?逻辑上,我从来没有使用PK的查询。 – Paparazzi 2011-12-28 21:51:00

+0

@BalamBalam我无法控制临时表的创建。但是我们确实检查了PK是否正在创建。我不知道为什么查询优化器不使用这个和它的一个奇怪的问题,因为我不能添加任何提示的查询。 – Eosphorus 2011-12-28 22:04:23

回答

6

用于查询的两个最常见的理由不使用索引:

  1. 这是更快地做一个全表扫描。
  2. 糟糕的统计数字。

如果您的查询选择了全部表格或进行连接而未提及where子句中的主键等,那么进行全面扫描可能会更快。没有查询和索引,最好还有解释计划,因此无法确定。

然而,我会建议你让你的DBA重新收集 - 我希望,如果不是第一次收集的话 - 统计数据。使用dbms_stats.gather_table_stats,估计百分比为25%+。

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

无法控制任何事情,我没有看到如何以任何其他方式提高查询时间。

+1

'无法控制任何事情,我没有看到如何以任何其他方式改善查询时间。“ - >这。也许最好收集整个模式统计信息。 – Sathya 2011-12-29 07:30:13

+0

@Sathya,我想是的。我正在回答一个查询使用某些表,但**如果**统计数据收集不好,值得在任何地方进行。 – Ben 2011-12-29 10:45:09

+0

为模式中的其他表收集统计信息应用程序创建临时表,使用它们并在过程完成时将其删除,因此收集统计信息可能会成为问题。那么我想没有办法改善查询时间。 – Eosphorus 2011-12-29 14:44:12

2

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

我明白你没有控制SQL,我有很多应用程序,我遇到同样的限制。在检查了Ben的帖子中的查询结构和统计信息之后,你已经证明,使用索引提示会提高性能,为什么不尝试手动创建SQL配置文件。

Christian Antognini有一篇关于SQL Profiles的文章here,并且手动创建它们。该文件提到手动创建SQL配置文件是未记录的。我同意没有文件,但这并不意味着不受支持。我会说那里几乎没有文档,但是如果您想要证明Oracle允许手动创建,请检查API或查看SQLT实用程序目录中的coe_xfr_sql_profile.sql文件。

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

+0

非常感谢。这篇文章非常有帮助。我会研究这一点 – Eosphorus 2011-12-29 16:08:49

相关问题