索引聚簇因子clustering_factor太大导致不走索引

来源:这里教程网 时间:2026-03-03 19:38:31 作者:

查询条件超过一个月就不走索引:

检查表的block数和数据行数:

select blocks,num_rows from dba_tables where table_name='MS_MZXX'; blocks:618687 num_rows:20335462

查看聚簇因子clustering_factor的数: select clustering_factor from dba_indexes where index_name='IDX_MS_MZXX_SFRQ'; clustering_factor:18031075

设置聚簇因子clustering_factor大小为500万:

exec dbms_stats.set_index_stats(ownname => 'PHIS_SHOW',indname => 'IDX_MS_MZXX_SFRQ',clstfct => 5000000);

设置成500万后,查询终于走索引。

Clustering Factor的计算方式如下: 扫描一个索引(large index range scan),比较某行的rowid和前一行的rowid,如果这两个rowid不属于同一个数据块,那么cluster factor增加1;整个索引扫描完毕后,就得到了该索的clustering_factor。

按照这个计算,clustering_factor应该比块数稍微大一些。差异特别大,可以对索引做rebuild操作,聚簇因子会自己改成合适的数值,略大于块数。

正常情况blocks<clustering_factor<num_rows,clustering_factor越靠近block数,说明表中的记录很有序,读取少量的data block就能得到想要的数据,但clustering factor接近表记录数,说明表的存储和索引排序差异很大,在做index range scan的时候,会额外读取多个block,代价较高。  

相关推荐