这是使用反向索引的好例子吗?
我说的是正确的:
插入(进入索引)会更快..因为新值将随机插入,而不是总是转到最右边的叶子(不断强制重新平衡).
索引查找速度会慢一点..因为数据库必须花费(一点点)时间来反转索引.
因为它是一个替代密钥..我真的不需要范围扫描能力(你不能用反向索引).
(注意,我没有使用Oracle RAC)
从性能的角度来看,在任何给定的时间点都有一个或两个热块可以更好地接受插入,因为这基本上保证了热块将在缓冲区高速缓存中,而INSERT将不必招致从磁盘读取块的成本.如果你有一个插入进入索引中的随机块,那么你想要的块有可能会从缓存中老化,并且会产生物理I / O的成本.
保持指数平衡的成本非常小,但即便有利于标准指数.如果你有一个序列生成的主键具有正常索引,那么当该块填满时,Oracle将在最右边的块上执行90/10 block split.相反,如果你有一个反向键索引,那么只要给定的块填满,Oracle就必须执行50/50 block splits. 50/50块分割将旧块的一半数据复制到新块,90/10块分割仅将最右边的数据值复制到新块.因此,90/10块拆分比50/50块拆分便宜得多,无论您选择何种类型的索引,都需要进行大致相同数量的块拆分.因此,维护常规索引的成本低于维护反向键索引的成本,甚至忽略缓存的影响.
您考虑使用反向键索引的原因是您正在使用RAC,并且您希望避免让许多RAC节点都在同一个热块上进行战斗的成本.如果您经常需要将热块从一个节点发送到另一个节点以进行下一次插入,则可能值得使用反向键索引来减少该争用.如果您已获得分区选项的许可,则最好还是使用散列分区索引(无论表是否已分区,都可以这样做).如果您尚未许可分区选项,则反向键索引可能足以解决热块上的争用,从而不需要您对许可证进行分区.