gpt4 book ai didi

sql - 聚类因子和唯一键

转载 作者:行者123 更新时间:2023-12-01 00:57:47 25 4
gpt4 key购买 nike

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

Basically, the CF is calculated by performing a Full Index Scan and looking at the rowid of each index entry. If the table block being referenced differs from that of the previous index entry, the CF is incremented. If the table block being referenced is the same as the previous index entry, the CF is not incremented. So the CF gives an indication of how well ordered the data in the table is in relation to the index entries (which are always sorted and stored in the order of the index entries). The better (lower) the CF, the more efficient it would be to use the index as less table blocks would need to be accessed to retrieve the necessary data via the index.



我的索引统计:

所以,这是我正在分析的索引(仅一列的索引)。

索引起始 PK_是我的主键和 UI是唯一键。 (当然两者都拥有独特的值(value))

查询 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 之上

最佳答案

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

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

  • 只需使用可以满足您的常见查询的附加列创建补充索引。如果所有必需的列都在索引中,Oracle 可以在不引用基表的情况下从索引返回结果集。如果可能,请考虑将列添加到 PK 的尾端以处理最繁重的查询(如果您的查询的列数较少,则很实用)。这通常比将所有表更改为 IOT 更可取。
  • 使用 IOT(索引组织表) - 它是一个表,存储为索引,因此按主键排序。
  • 排序散列集群 - 更复杂,但在访问某个键的记录列表时也可以产生 yield (例如给定电话号码的一堆文本消息)
  • 重新组织您的数据并按照索引的顺序将记录存储在表中。如果您的数据没有改变,并且您只想重新排序堆,但您无法明确控制顺序,则此选项是可以的;您所能做的就是对查询进行排序并让 Oracle 将其附加到一个新段。

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

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

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

    关于sql - 聚类因子和唯一键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26148618/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com