全表扫描而不是索引范围扫描会导致性能问题

时间:2011-04-01 07:23:45

标签: sql oracle oracle11g

我们有一个合并语句如下所示,而不是索引范围扫描它正在进行全表扫描。它成功运行到最后,直到表更改后,当它开始进行全表扫描时添加3-4个新列。

我们有7个类似的表,具有相同的更改,即添加了3-4列,但是当我们重新构建索引时,它解决了问题,除了一个表。

有人可以对此有所了解吗?

-Nagu

1 个答案:

答案 0 :(得分:1)

尝试收集涉及的表格的统计信息。执行此操作的最佳方法是使用DBMS_STATS包中的例程。最简单的方法是简单地调用DBMS_STATS.GATHER_DATABASE_STATS,不指定任何参数(即使用所有参数的默认值)。但是,这需要一段时间。要收集单个表的统计信息,可以使用DBMS_STATS.GATHER_TABLE_STATS。您需要为'ownname'和'tabname'参数赋值;因此,如果您感兴趣的表名为“MY_SCHEMA.MY_TABLE”,则对DBMS_STATS.GATHER_TABLE_STATS的调用将如下所示

DBMS_STATS.GATHER_TABLE_STATS('MY_SCHEMA', 'MY_TABLE');

此例程还有其他参数,但默认值可以正常工作。

如果数据库仍然坚持对您感兴趣的表进行全表扫描,则可能意味着您的表上没有索引,数据库认为该索引可能对满足查询有用。如果您可以发布查询代码并告诉我们您在桌面上有哪些索引,那么我们可能会提出其他建议。

分享并享受。