在代理键上使用反向索引的好习惯? (Oracle)的

时间:2012-03-31 23:15:21

标签: oracle indexing

假设我有一个带有自动递增代理键的表。

使用反向索引这是一个好例子吗?

我说的是正确的:

插入(进入索引)会更快..因为新值会随机插入,而不是总是到达最右边的叶子(不断强制重新平衡)。

索引查找速度会慢一些..因为数据库必须花费(一点点)时间来反转索引。

因为它是代理键..我不需要范围扫描能力(你不能用反向索引)。

(注意,我没有使用Oracle RAC)

1 个答案:

答案 0 :(得分:8)

通常,如果您不使用RAC,则没有理由使用反向键索引。

从性能的角度来看,你最好在任何给定的时间点都有一个或两个热块可以插入,因为这基本上保证了热块将在缓冲区缓存和{{1不必承担从磁盘读取块的成本。如果你有一个插入进入索引中的随机块,那么你想要的块有可能会从缓存中老化,并且会产生物理I / O的成本。

保持指数平衡的成本非常小,但即使这有利于标准指数。如果你有一个带有正常索引的序列生成主键,那么当该块填满时,Oracle将在最右边的块上执行90/10 block split。相反,如果你有一个反向键索引,那么只要给定的块填满,Oracle就必须50/50 block splits。 50/50块拆分将旧块的一半数据复制到新块,90/10块拆分仅将最右边的数据值复制到新块。因此,90/10块拆分比50/50块拆分便宜得多,无论您选择何种类型的索引,都需要进行大致相同数量的块拆分。因此,维护常规索引的成本低于维护反向键索引的成本,甚至忽略缓存的影响。

您考虑使用反向键索引的原因是您正在使用RAC,并且您希望避免让许多RAC节点都在同一个热块上进行战斗的成本。如果您经常需要将热块从一个节点发送到另一个节点以进行下一次插入,则可能值得使用反向键索引来减少该争用。如果您已获得分区选项的许可,则最好还是使用散列分区索引(无论表是否已分区,都可以这样做)。如果您尚未许可分区选项,则反向键索引可能足以解决热块上的争用,从而不需要您对许可证进行分区。