Mah*_*kar 4 sql oracle database-administration query-performance table-index
聚类因子 - 关于如何计算它的一个很棒的简单解释:
基本上,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';
Run Code Online (Sandbox Code Playgroud)
结果:
INDEX_NAME UNIQUENES CLUSTERING_FACTOR NUM_ROWS CLUSTER_PCT
-------------------- --------- ----------------- ---------- -----------
PK_TEST UNIQUE 10009871 10453407 96 --> So High
UITEST01 UNIQUE 853733 10113211 9 --> Very Less
Run Code Online (Sandbox Code Playgroud)
我们可以看到 PK 具有最高的 CF,而其他唯一索引则不是。
让我印象深刻的唯一合乎逻辑的解释是,下面的数据实际上是按唯一索引上的列顺序存储的。
1)我的这种理解正确吗?
2)有什么办法可以给出PK,最低的CF数字吗?
3)从使用这两个索引的查询成本来看,单选择的速度非常快。但 CF 数字仍然让我们困惑。
该表相对较大,超过 10M 记录,并且还接收实时插入/更新。
我的数据库版本是 Oracle 11gR2,基于 Exadata X2
您正在看到由有序树结构索引的堆表的证据。
要获得极低的 CF 数,您需要根据索引对数据进行排序。如果您想执行此操作(如 SQL Server 或 Sybase 聚集索引),在 Oracle 中您有几个选择:
如果您的大多数访问模式是随机(OLTP)、单记录访问,那么我不会单独担心集群因素。这只是一个既不好也不好的指标,它只取决于上下文以及您想要实现的目标。
永远记住,Oracle 的问题不是 SQL Server 的问题,因此请确保任何设计更改都通过性能测量来证明合理。Oracle 具有高度并发性,并且争用率非常低。它的多版本并发设计非常高效,与其他数据库不同。也就是说,如果这是您的常见用例,那么为顺序访问排序数据仍然是一个很好的调整实践。
要阅读有关此主题的更好建议,请阅读 Ask Tom: 什么是 Oracle 的聚集索引和非聚集索引