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 反向主键的主要内容,如果未能解决你的问题,请参考以下文章
教你使用powerDesigner反向生成oracle数据库模型