Oracle 中的全局非分区索引

vit*_*ala 0 oracle indexing partitioning

我正在阅读 Oracle 分区索引的文档。人们随处都可以发现本地分区索引和全局分区索引之间的区别,这对我来说是很清楚的。

我很困惑,“全局”一词并不意味着索引根本已分区。

例如,Thomas Kyte 在“专家 Oracle 数据库架构”中有几个示例,如下所示:

create index partitioned_idx_global
on partitioned(timestamp)
GLOBAL;
Index created.
Run Code Online (Sandbox Code Playgroud)

人们可以在其他地方找到类似的示例,其中关键字 GLOBAL 后面没有任何分区描述。

GLOBAL 之后没有分区子句,这似乎与CREATE INDEX docs中允许的内容形成对比。

非分区全局索引的文档对我来说也没有多大意义。

全局非分区索引的行为与本地非分区索引类似。

“本地非分区索引”到底是什么?它甚至不应该存在。

所以最终我的问题是消除混乱。常规索引和全局非分区索引有什么区别?上面书中引用的语法是否“合法”?

APC*_*APC 5

“本地非分区索引”到底是什么?

不存在“本地非分区索引”之类的东西。看起来这很可能是一个文档错误。我认为他们想说的是

“全局非分区索引的行为就像非分区表上的索引一样。”

所以是的,Tom Kyte 书中引用的语法是合法的。

GLOBAL 之后没有分区子句,这似乎与 CREATE INDEX 文档中允许的内容相反

默认情况下,GLOBAL 索引是非分区的。也就是说,表的所有分区都有一个索引。我们可能想要这样做的主要原因是在整个表中强制执行唯一约束。实际上,很少需要这样做:分区通常仅限于数据仓库,其中约束执行通常较宽松,因为 DML 更加锁定。

您链接到的文档显示了如何创建全局分区索引。这是一种混合结构,它允许我们使用与数据分区方案不同的分区方案构建索引。老实说,我从未在任何使用分区的网站中遇到过这种情况。然而,@matthewmcpeak 提出了一个可能有用的场景。因此,为了未来的探索者的利益,我将他的评论包含在这个答案中。

全局哈希分区索引是减少对序列值的非常活跃、唯一索引的争用的好方法。通常,所有插入都位于索引的右侧。如果许多并行会话中有许多插入,则可能会出现很多争用 - 每个会话都会给其他会话带来更多工作(因为它们都需要应用大量 UNDO 来撤销已提交的更改以获得一致的块读取) )。对此的一个旧解决方案是使用REVERSE索引。现在,全局哈希分区索引更好——减少争用,而不会破坏物理 I/O。应用该技术不需要对表本身进行分区。