我正在阅读有关Oracle分区索引的文档。到处都可以找到本地分区索引和全局分区索引之间的区别,这对我来说很明显。
我很困惑“全局”一词并不意味着索引完全是分区的。
例如Thomas Kyte在“专家Oracle数据库体系结构”中有几个示例,如下所示:
create index partitioned_idx_global
on partitioned(timestamp)
GLOBAL;
Index created.
并且可以找到类似的示例,其中关键字GLOBAL后面没有任何分区描述。
GLOBAL之后没有分区子句,这似乎与CREATE INDEX docs所允许的相反。
documentation for nonpartitioned global indexes对我也没有多大意义。
全局非分区索引的行为类似于本地非分区索引。
“本地非分区索引”到底是什么?它甚至不应该存在。
因此,最终我的问题是消除混乱。正则索引和全局非分区索引有什么区别?上面的书中引用的语法甚至是“合法的”吗?
答案 0 :(得分:4)
“本地非分区索引”到底是什么?
没有诸如“本地非分区索引”之类的内容。似乎可能是文档错误。我认为他们的意思是
“全局非分区索引的行为就像非分区表上的索引一样。”
是的,汤姆·凯特(Tom Kyte)的书中引用的语法是合法的。
GLOBAL之后没有分区子句,这似乎与CREATE INDEX文档中所允许的相反
默认情况下,GLOBAL索引是未分区的。也就是说,表的所有分区都有一个索引。我们可能要这样做的主要原因是在整个表上强制执行唯一约束。实际上,很少需要这样做:分区通常仅限于数据仓库,因为DML的锁定程度更高,因此约束执行通常较为宽松。
您链接到的文档显示了如何创建GLOBAL分区索引。这是一种混合结构,它使我们可以使用与用于分区数据的分区方案不同的分区方案来构建索引。老实说,我从未在与Partitioning合作过的任何网站上遇到过这种情况。但是,@ matthewmcpeak提出了一种可能有用的方案。因此,为了将来的搜索者的利益,我将他的评论包括在此答案中。
全局散列分区索引是一种减少序列值非常活跃的唯一索引上争用的好方法。通常,所有插入都在索引的右侧。如果许多并行会话中有许多插入,则可能会有很多争用-每个会话都会给其他会话带来更多工作(因为它们都需要应用大量的UNDO来撤消已提交的更改,以获取一致的块读取)。对此的一种旧解决方案是使用
REVERSE
索引。现在,全局散列分区索引更好-减少争用,而不会增加物理I / O。 该表本身不需要分区即可应用该技术。
答案 1 :(得分:1)
原则上,Oracle提供三种类型的索引。
UNUSABLE
,并且必须重新构建它。我认为Oracle文档没有使用一致的名称,并且不能正确区分这三种类型。最常见的是GLOBAL和LOCAL索引。实际上,我无法想象有一个用PARTITONED索引有意义的用例,它们可能仅在非常特殊的情况下才有用。