查询索引列时的全表扫描

时间:2012-01-06 16:43:36

标签: performance oracle indexing

我为一个表创建了一个索引,这是一个简单的索引:

CREATE INDEX IDX_TRANSACAO_NOVA_STATUS ON TRANSACAO_NOVA(STATUS) TABLESPACE COMVENIF;

此表有1000K寄存器,状态表只有5或6个可能的值。在创建索引后,我预计下面的查询会有更好的性能:

select * from transacao_nova tn where tn.status = 'XXX'

但是,解释计划仍然显示我的成本为16.000的完整扫描。

任何帮助?我不是dba,但我需要提高这种性能。

提前感谢。

4 个答案:

答案 0 :(得分:4)

如果只有5或6个不同的状态值和100万条记录,则查询优化器可能会决定使用索引进行范围扫描是不值得的,该范围扫描仍将返回表中所有记录的大量数据。

您可能会考虑为此应用程序使用索引聚簇表。

答案 1 :(得分:1)

如果状态列中的数据es 倾斜(不均匀:某些值经常出现而其他值很少出现),您可以通过刷新统计信息来加速查询罕见值(并验证您正在计算状态列的直方图。这将使Oracle在更高效的情况下使用索引

http://docs.oracle.com/cd/E11882_01/server.112/e16638/stats.htm#autoId12

请注意,自动确定列是否需要直方图并不是一个好主意,因为它可能会导致行为不一致。最好在需要时手动指定直方图。此外,直方图会影响使用这些列的每个查询,因此应小心收集它们。

答案 2 :(得分:0)

您可能需要在表格上生成新的统计信息。

http://docs.oracle.com/cd/B19306_01/server.102/b14211/stats.htm

答案 3 :(得分:0)

一个常见的错误是假设索引范围扫描比完整扫描更好,因为您只需要表中总行数的一小部分。但是,如果您想要的行分散在整个表的存储扩展区中,则通过索引查找来定位它们可能比扫描整个表要慢。我不能肯定地说你情况就是如此,但这是可能的。

有关此主题的更深入讨论,我建议this paper