查询条件超过一个月就不走索引:
检查表的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,代价较高。