聚类因子 - 关于如何计算的简单解释:
基本上,CF是通过执行全索引扫描来计算的 查看每个索引条目的rowid。如果表块正在 引用与前一个索引条目的不同,CF是 递增。如果引用的表块与 在上一个索引条目中,CF不会递增。所以CF给了一个 指示表中数据的有序排序 索引条目(总是按顺序排序和存储 索引条目)。 CF越好(越低),效率越高 将使用索引,因为需要更少的表块 访问以通过索引检索必要的数据。
我的索引统计信息:
因此,这里是我的索引(仅一列的索引)正在分析中。
索引启动PK_
是我的主键,UI
是唯一键。 (当然都有独特的价值观)
查询1:
SELECT index_name,
UNIQUENESS,
clustering_factor,
num_rows,
CEIL((clustering_factor/num_rows)*100) AS cluster_pct
FROM all_indexes
WHERE table_name='MYTABLE';
结果:
INDEX_NAME UNIQUENES CLUSTERING_FACTOR NUM_ROWS CLUSTER_PCT
-------------------- --------- ----------------- ---------- -----------
PK_TEST UNIQUE 10009871 10453407 96 --> So High
UITEST01 UNIQUE 853733 10113211 9 --> Very Less
我们可以看到PK具有最高CF而另一个唯一索引不是。
唯一合乎逻辑的解释是,下面的数据实际上是按唯一索引的列顺序存储的。
1)我是否理解这种理解?
2)有没有办法给PK,最低的CF
数字?
3)使用这两个索引查看查询成本,单个选择速度非常快。但是,CF编号仍然让我们感到困惑。
该表相对超过10M记录,并且还接收实时插入/更新。
我的数据库版本是Oracle 11gR2,而不是Exadata X2
答案 0 :(得分:4)
您正在看到由有序树结构索引的堆表的证据。
要获得极低的CF编号,您需要根据索引对数据进行排序。如果要执行此操作(如SQL Server或Sybase聚簇索引),在Oracle中有几个选项:
如果您的大多数访问模式是随机的(OLTP),单个记录访问,那么我不会单独担心群集因素。这只是一个既不坏也不好的指标,它只取决于背景,以及你想要实现的目标。
永远记住,Oracle的问题不是SQL Server的问题,因此请确保通过性能测量来证明任何设计更改都是合理的。 Oracle高度并发,争用率很低。它的多版本并发设计非常高效,与其他数据库不同。也就是说,如果这是您的常见用例,那么为顺序访问订购数据仍然是一个很好的调整实践。
要阅读有关此主题的更好建议,请阅读问问汤姆: what are oracle's clustered and nonclustered indexes