暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何在没有索引的情况下计算一个字段的Clustering_Factor值?

原创 章芋文 2019-10-17
422

通过对索引的字段与表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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论