繁体   English   中英

针对索引列进行查询时的全表扫描

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM