Oracle 反向主键

Posted

技术标签:

【中文标题】Oracle 反向主键【英文标题】:Oracle Reverse Primary Keys 【发布时间】:2017-11-06 19:45:22 【问题描述】:

我正在尝试在我的主键列上创建一个带有反向索引的表。

表创建好了,我插入了很多数据,生成了一个带有序列的键值。

根据我对反向键的了解,关于它如何获取 nextval 并将其反转,然后插入...我希望在我的 select 语句中看到键值反转。

如果 nextval 是 112,当我从表中选择时,我希望看到 211。但我仍然看到 112。

是否还在实现反向键索引,而Oracle只是以非反向格式显示?

还是真的有什么问题?

我用于索引的 SQL 是

CREATE UNIQUE INDEX "<schema>"."<index_name>" ON "<schema>"."<table_name>" ("SYS_I") REVERSE;

【问题讨论】:

【参考方案1】:

反向键索引不会更改键值。 只有存储在磁盘上的物理表示发生了变化。 来自the documentation

反向键索引

反向键索引是一种 B-tree 索引 ,它在物理上反转每个索引键的字节,同时保持 列顺序。 例如,如果索引键是 20,如果两个 以十六进制存储此密钥的字节在标准中为 C1,15 B树索引,然后反向键索引将字节存储为15,C1。

反转密钥解决了叶块争用问题 B树索引的右侧。这个问题可能特别严重 在 Oracle Real Application Clusters (Oracle RAC) 数据库中,其中 多个实例重复修改同一个块。例如,在 一个订单表,订单的主键是顺序的。一 集群中的实例添加订单 20,而另一个添加 21,与 每个实例将其密钥写入右侧的同一叶块 索引的一侧。

在反向键索引中,字节顺序的反转分布 插入索引中的所有叶键。例如,键如 在标准键索引中相邻的 20 和 21 是 现在存储在单独的块中。因此,用于插入的 I/O 顺序键分布更均匀。

因为索引中的数据不是按列键排序的 存储时,反向键排列消除了运行的能力 某些情况下的索引范围扫描查询。例如,如果用户 发出大于 20 的订单 ID 的查询,则数据库无法 从包含此 ID 的块开始并水平进行 穿过叶子块。

【讨论】:

以上是关于Oracle 反向主键的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中使用主键对 url 进行反向操作

Oracle索引总结- Oracle索引种类之反向索引

Oracle 反向索引(反转建索引) 理解

教你使用powerDesigner反向生成oracle数据库模型

backreference Oracle正則表達式中的反向引用

Django 错误:“image_upload”的反向,没有找不到参数?