聚簇因子和执行计划的联系
在生产环境中有些sql语句执行没有问题,可以正常启用索引,但是复制数据到其他环境之后,却发现走了全表扫描。或者情况相反,本来全表扫描的查询却走了索引扫描。
这种情况出现的原因比较复杂,其中一个很重要的原因就是聚簇因子。
聚簇因子是一个与索引相关的统计信息,决定了当前的SQL语句是否走索引,还是全表扫描以及是否作为嵌套连接外部表等。
查询聚簇因子(CLUSTERING_FACTOR)(先收集统计信息)
SQL> exec dbms_stats.gather_table_stats(null,'TEST',CASCADE=>true);
SQL> set linesize 150
SQL> select i.table_name,i.index_name,i.CLUSTERING_FACTOR,t.blocks,i.NUM_ROWS from user_tables t,user_indexes i where t.table_name=i.table_name and t.table_name in ('TEST');
表的聚簇高,就可能走全表扫描,聚簇低,就可能走索引扫描。
对于聚簇因子,可以根据索引列重新排列表中的数据调整聚簇因子大小,有一定的的难度。需要注意的是,这种按某一个目标索引的索引键值排序后重新存储表中数据的方法确实可以降低该目标索引聚簇因子的值,但可能会同时增加该表上存在的其他索引值的聚簇因子的值。
创建第二个表,以第一个表的object_id为正序排列插入,这样可以让object_id上的索引有顺序了,聚簇因子也就低了
create table TEST2 as select * from TEST order by object_id;
create index test2_ind on test2(object_id);
聚簇因子和执行计划
最新推荐文章于 2021-04-03 03:47:37 发布