聚类因子和唯一键

时间:2014-10-01 18:59:28

标签: 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';

结果:

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

1 个答案:

答案 0 :(得分:4)

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

要获得极低的CF编号,您需要根据索引对数据进行排序。如果要执行此操作(如SQL Server或Sybase聚簇索引),在Oracle中有几个选项:

  1. 只需使用可满足常见查询的其他列创建补充索引。如果所有必需的列都在索引中,Oracle可以从索引返回结果集而不引用基表。如果可能,请考虑在PK的尾端添加列以提供最重的查询(如果查询的列数很少,则可行)。通常建议将所有表更改为IOT。
  2. 使用IOT(索引组织表) - 它是一个表,存储为索引,因此按主键排序。
  3. 排序哈希群集 - 更复杂,但在访问某个密钥的记录列表时也会产生收益(如给定电​​话号码的一堆短信)
  4. 重新组织您的数据并按索引的顺序将记录存储在表中。如果您的数据没有更改,并且您只想重新排序堆,则此选项可以,但您无法明确控制订单;您所能做的就是订购查询,让Oracle将其附加到新的细分市场。
  5. 如果您的大多数访问模式是随机的(OLTP),单个记录访问,那么我不会单独担心群集因素。这只是一个既不坏也不好的指标,它只取决于背景,以及你想要实现的目标。

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

    要阅读有关此主题的更好建议,请阅读问问汤姆: what are oracle's clustered and nonclustered indexes