[英]Full table scan when querying against an indexed column
我为一个表创建了一个索引,就像这样的简单索引:
CREATE INDEX IDX_TRANSACAO_NOVA_STATUS ON TRANSACAO_NOVA(STATUS) TABLESPACE COMVENIF;
该表有1000K个insinde寄存器,状态表只有5个或6个可能的值。 创建索引后,我希望查询波纹管将具有更好的性能:
select * from transacao_nova tn where tn.status = 'XXX'
但是,解释计划仍然向我显示了16.000成本的完整扫描。
有什么帮助吗? 我不是dba,但我需要提高这一性能。
提前致谢。
如果只有5个或6个不同的状态值,并且有一百万条记录,查询优化器可能会认为不值得使用索引来进行范围扫描,而该范围扫描仍会返回表中所有记录的大部分。
您可能会考虑为此应用程序使用索引集群表。
如果状态列中的数据倾斜 (不统一:某些值经常出现而另一些值很少出现),则可以通过刷新统计信息(并确认您正在为状态列计算直方图 )来加快对稀有值的查询。 在效率更高的情况下,它将使Oracle使用索引。
http://docs.oracle.com/cd/E11882_01/server.112/e16638/stats.htm#autoId12
请注意,自动确定一列是否需要直方图不是一个好主意,因为它可能会导致行为不一致。 最好在需要时手动指定直方图。 而且,直方图会影响使用这些列的每个查询,因此应谨慎收集它们。
您可能需要在表上生成新的统计信息。
http://docs.oracle.com/cd/B19306_01/server.102/b14211/stats.htm
一个常见的错误是假设索引范围扫描将比全扫描更好,因为您只希望表中总行的“小”部分。 但是,如果所需的行分散在表的存储范围中,则通过索引查找定位它们可能比仅扫描整个表要慢。 我不能肯定地说这是您的情况,但这是有可能的。
要对该主题进行更深入的讨论,我推荐本文 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.