oracle - 在代理键上使用反向索引的好习惯? (甲骨文)

标签 oracle indexing

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

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

我说的对吗:

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

索引查找会稍微慢一些......因为数据库将不得不花费(一点)时间来反转索引。

因为它是一个代理键..我真的不需要范围扫描能力(你不能用反向索引做到这一点)。

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

最佳答案

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

从性能的角度来看,在任何给定的时间点有一个或两个受插入影响的热块要好得多,因为这基本上保证了热块将在缓冲区缓存和 INSERT 中。不必承担从磁盘读取块的成本。如果您在索引中的随机块中插入了插入,则您想要的块很可能会从缓存中老化并产生物理 I/O 的成本。

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

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

关于oracle - 在代理键上使用反向索引的好习惯? (甲骨文),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9960535/

相关文章:

oracle - 如何查明选择授权是直接获得还是通过角色获得

c# - 批量插入 Oracle 数据库的最有效方法是什么?

sql - 如何在表中插入多个默认值

java - 使用 Projections.rowCount() 的 Hibernate 标准查询会导致数字溢出

javascript - 获取 jCarouselLite 图像/页面的当前索引

sql - 查询简化 Oracle Northwind

c++ - C负数组索引

SQL 索引和性能改进

postgresql 索引 - 它们是密集的还是稀疏的?

mysql - 在非常大的 MySQL 分析表中 - 我应该索引时间戳吗?