4

聚类因子 - 关于如何计算的一个很棒的简单解释:

基本上,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

4

1 回答 1

5

您正在看到由有序树结构索引的堆表的证据。

要获得极低的 CF 数,您需要根据索引对数据进行排序。如果你想这样做(比如 SQL Server 或 Sybase 聚集索引),在 Oracle 中你有几个选择:

  1. 只需使用可以满足您的常见查询的附加列创建补充索引。如果所有需要的列都在索引中,Oracle 可以从索引返回结果集,而无需参考基表。如果可能,请考虑在 PK 的尾端添加列以服务于最繁重的查询(如果您的查询的列数较少,这很实用)。这通常比将所有表更改为 IOT 是可取的。
  2. 使用 IOT(索引组织表)- 它是一个表,存储为索引,因此按主键排序。
  3. 排序哈希集群 - 更复杂,但在访问某个键的记录列表时也可以产生收益(例如给定电话号码的一堆短信)
  4. 重新组织数据并按照索引的顺序将记录存储在表中。如果您的数据没有更改,并且您只想重新排序堆,则此选项可以,尽管您无法显式控制顺序;您所能做的就是订购查询并让 Oracle 将其附加到新段。

如果您的大多数访问模式都是随机 (OLTP)、单记录访问,那么我不会单独担心集群因素。这只是一个既不好也不好的指标,它仅取决于上下文以及您要完成的工作。

永远记住,Oracle 的问题不是 SQL Server 的问题,因此请确保任何设计更改都通过性能测量来证明是合理的。Oracle 是高度并发的,并且竞争非常低。它的多版本并发设计非常高效,有别于其他数据库。也就是说,如果这是您的常见用例,那么为顺序访问排序数据仍然是一种很好的调优做法。

要阅读有关此主题的更好建议,请阅读 Ask Tom: 什么是 oracle 的聚集索引和非聚集索引

于 2014-10-01T19:08:21.757 回答