通过对索引的字段与表rowid进行排序,然后通过lag函数对rowid的file/block(从rowid的字符串表示形式截取相关字符)与上一个进行比较,以查看当前该行与上一行是否在同一块中。如果该行在不同的块中,我们将计数为1,否则为零。
可以看下demo,我从视图all_objects复制了一些数据,首先通过SQL查询出clustering_factor值,然后再创建索引,并检查了其clustering_factor是否与前面SQL计算的值一致。
--创建表
create table t1
as
select *
from all_objects
where rownum <= 10000
;
--通过lag对比相邻两行的rowid计算CF值
select
sum(count_chg)
from (
select
case
when substr(rowid,7,9) <> lag(substr(rowid,7,9),1,'000000000') over(order by object_name, rowid)
then 1
else 0
end count_chg
from t1
);
SUM(COUNT_CHG)
--------------
3901
--创建索引,查询索引字段的CF值
create index t1_i1 on t1(object_name);
select clustering_factor
from user_indexes
where table_name = 'T1'
and index_name = 'T1_I1';
CLUSTERING_FACTOR
-----------------
3901
以上可以看出SQL计算的CF值与索引的CF值一致,但是这只对普通表的索引和分区表的全局索引有效,同时table_cached_blocks值必须等于1,否则无法通过以上SQL计算字段的CF值。
最后修改时间:2019-10-17 18:00:58
「喜欢文章,快来给作者赞赏墨值吧」
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。