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

2024-01-09

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

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

我的说法是否正确:

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

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

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

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


一般来说,如果您不使用 RAC,则没有理由使用反向键索引。

从性能的角度来看,在任何给定时间点拥有一两个热块会更好,因为这基本上保证了热块将位于缓冲区高速缓存中,并且INSERT不必承担从磁盘读取块的成本。如果您将插入插入到索引中的随机块中,那么您想要的块很有可能已经在缓存中老化,并会产生物理 I/O 的成本。

保持指数平衡的成本非常低,但即使这样也有利于标准指数。如果您有一个带有普通索引的序列生成主键,Oracle 将执行以下操作:90/10 块分割 http://hemantoracledba.blogspot.com/2009/05/index-block-splits-90-10.html当该块填满时,在最右边的块上。相反,如果您有反向键索引,Oracle 必须这样做50/50 块分割 http://hemantoracledba.blogspot.com/2011/02/index-block-splits-with-reverse-key.html每当给定的块填满时。 50/50 块分割将旧块的一半数据复制到新块,90/10 块分割仅将最右边的数据值复制到新块。因此,90/10 块分割比 50/50 块分割便宜得多,并且无论您选择哪种索引类型,您都需要进行大致相同数量的块分割。因此,即使忽略缓存的影响,维护常规索引的成本也低于维护反向键索引的成本。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • 根据最大值连接表

    这是我正在谈论的内容的一个简化示例 Table students exam results id name id student id score date 1 Jim 1 1 73 8 1 09 2 Joe 2 1 67 9 2 09 3
  • 从java运行sqlplus脚本的简单方法

    我有包含 sqlplus 特定脚本的 sql 文件 它包括 或 作为语句终止符 执行存储过程的 EXEC 等 我需要从 java jdbc 执行此脚本 而不需要 sqlplus sql ant任务 maven sql插件无法处理不同的终止符
  • 如何为“%abc%”搜索创建文本索引?

    我想对查询进行索引x like abc 如果我有一个如下表 create table t data varchar 100 我想创建一个索引以便能够有效地执行以下操作 select from t where contains abc 和这个
  • 在 Oracle 中如何将多行组合成逗号分隔的列表? [复制]

    这个问题在这里已经有答案了 我有一个简单的查询 select from countries 结果如下 country name Albania Andorra Antigua 我想在一行中返回结果 如下所示 Albania Andorra
  • 在仅具有两种类型值的列上创建索引有多有效

    我在列上创建了一个索引 该列只有两个可能的值 Y 和 N 两个值的数据类型相同 假设列名称是指示符 我写了一个选择语句 例如 SELECT INDICATOR FROM TEMP TABLE ORDER BY INDICATOR 当我在 S
  • 2 同一个表的同一列上的 PostgreSQL 索引 - 冗余吗?

    我有一个带有 2 个索引的 PostgreSQL 表 其中一项指数涵盖website id and tweet idcolumns 是唯一的 B 树索引 第二个索引仅涵盖website id列 并且是非唯一索引 如果第一个索引存在 第二个索
  • 从 Oracle 获取包方法和参数

    我正在寻找 Oracle 查询来获取 Oracle 包 过程的所有参数 我知道有一个视图或表可以提供此功能 但我似乎不记得它是什么 注意 我并不是要从 user objects 获取包列表 而是要获取包 中每个过程的数据类型和参数名称 Th
  • 如何在 PL/SQL 中查找字符串中不同字符的数量和名称[重复]

    这个问题在这里已经有答案了 我对 PL SQL 很陌生 我需要获取字符串中不同字符的名称和计数 例如 如果我有一个字符串str helloexample 我需要获得不同字符的输出str i e heloxamp 我怎样才能做到这一点 您可以
  • 当表有聚集索引时,数据是如何存储的

    我发现了无数的帖子 开头都是这样的很多时候我遇到人们说 聚集索引根据聚集索引键对表内的数据进行物理排序 这不是真的 然后这些帖子继续描述它是如何通过链表或其他方式实际存储的 例如 这个post http sqlwithmanoj wordp
  • 为什么PostgresQL查询性能随着时间的推移而下降,但重建索引时又恢复了

    根据这个page http www postgresql org docs current static indexes examine html在手册中 indexes don t need to be maintained 然而 我们运
  • 将整数值从数据库列转换为Oracle中的文本

    我对数据库有一个要求 1 表ABC 列 check amount number number 18 4 这基本上包含例如支票金额 3000 50 支付给雇员 现在签发了一张支票 该支票包含数字和文本形式的 check amount 例如 支
  • 创建索引可以使用现有索引吗?

    我在 A B 和 C 列上有单独的索引 我想在 A B C 三列上创建一个复合索引 我的会有什么影响existing指数对综合指数creation 数据库会利用它们吗 它们是否无关紧要 或者它们会减慢我的新复合索引的创建速度吗 我正在使用
  • Oracle 事务在 C++ 和 Java 之间的传播

    我们有一个现有的 C 应用程序 我们将逐步将其替换为新的基于 Java 的系统 在我们用 Java 完全重新实现所有内容之前 我们期望 C 和 Java 必须相互通信 RMI SOAP 消息传递等 我们尚未决定 现在我的经理认为我们需要 J
  • 如何在 Pro*C 查询中指定变量表达式列表?

    我尝试优化的 Pro C 查询出现问题 解释一下 我们的应用程序在一个巨大的数据库中搜索行 这些行存在于多种语言中 旧代码为数组中的每种语言选择一行 现在 由于这些查询是我们应用程序中最耗时的部分 因此我只想进行一个直接写入数组的查询 语言
  • 如何从oracle存储过程中提取out变量?

    我有存储过程 其中有很多输出变量 所以我这样调用存储过程 export const infoHR3 async gt try const sql Declare ln order qty NUMBER ln in proc qty hr N
  • MySQL 中有“connect by”替代方案吗?

    如果我使用 Oracle 有connect by可用于创建分层查询的关键字 目前我正在一个项目中使用MySQL 我想知道是否有替代方案connect by在 MySQL 中 我尝试过谷歌 但到目前为止还没有结果 我想要实现的是通过一个查询从
  • Oracle中如何选择前100行?

    我的要求是获取每个客户的最新订单 然后获取前100条记录 我编写了一个如下查询来获取每个客户的最新订单 内部查询工作正常 但我不知道如何根据结果获得前 100 名 SELECT FROM SELECT id client id ROW NU
  • 如何在Oracle中将“(Ab56.12345)some_string”的一个字符串列拆分为两列“Ab.12345”,“some_string”

    正如问题一样 如何拆分一个字符串列 Ab56 12345 some string到两列Ab56 12345and some string在甲骨文中 注意 并非所有列都 Ab56 12345 some string 部分列仅some stri
  • 将十六进制转换为字符串

    我想用HEXTORAW 从 ASCII 十六进制代码 30 获取 char 值 ASCII HEX 30 应返回 varchar 0 该怎么做呢 是HEXTORAW 正确的功能 你可以使用utl raw http docs oracle c

随机推荐