我正在尝试在主键列上创建一个带有反向索引的表。
创建了表,我插入了大量数据,生成了带序列的键值。
根据我对反向键的理解,关于它如何获得nextval并将其反转,然后插入...我期望在我的select语句中看到键值反转。
如果nextval是112,当我从表格中选择时,我期待看到211.但我仍然看到112.
它是否仍在实现反向键索引,而Oracle只是以非反转格式显示?
或者实际上是错误的?
用于索引的SQL是
CREATE UNIQUE INDEX "<schema>"."<index_name>" ON "<schema>"."<table_name>" ("SYS_I") REVERSE;
答案 0 :(得分:5)
反向键索引不会更改键值 仅更改存储在磁盘上的物理表示 来自the documentation
反向键索引
反向键索引是一种B树索引,它在物理上反转每个索引键的字节,同时保持 列顺序。例如,如果索引键是20,如果是两个 以十六进制存储的此键的字节数是标准中的C1,15 B树索引,然后是反向键索引,将字节存储为15,C1。
反转键解决了叶块争用的问题 B树索引的右侧。这个问题可能特别严重 在Oracle Real Application Clusters(Oracle RAC)数据库中 多个实例重复修改同一个块。例如,在 订单表订单的主键是顺序的。一 集群中的实例添加了20个订单,而另一个添加了21个 每个实例将其密钥写入右侧相同的叶块 指数的一面。
在反向键索引中,字节顺序的反转分布 插入索引中的所有叶键。例如,键等 在标准密钥索引中相邻的20和21是 现在分开存放在不同的块中。因此,I / O用于插入 顺序键分布更均匀。
因为索引中的数据没有按列键排序 存储后,反向键排列消除了运行的能力 索引范围扫描查询在某些情况下。例如,如果是用户 发出订单ID大于20的查询,然后数据库不能 从包含此ID的块开始并水平继续 通过叶块。