我为一个表创建了一个索引,这是一个简单的索引:
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,但我需要提高这种性能。
提前感谢。
答案 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。