Oracle 分区和本地 Indexex (12c)

Posted

技术标签:

【中文标题】Oracle 分区和本地 Indexex (12c)【英文标题】:Oracle partitioning and local Indexex (12c) 【发布时间】:2018-03-24 21:22:09 【问题描述】:

我创建了一个按年份分区的表,并且我在表上创建了以下两个本地非唯一索引

idx1 : (年, 周, PD, sku) idx2 : (sku, str)

我的不足是 idx2 是多余的,您可以创建 一个带有 (year,wk, pd, sku, str) 的索引以利用跳过扫描。 有什么想法或方法吗?

【问题讨论】:

每年/每周平均会有多少个 pd 不同的值? 不多..说13左右 每周很多。这意味着,即使给定年份和 SKU,INDEX SKIP SCAN 也需要进行 676 次索引探测。仍然可能比FULL SCAN 更好,但我更愿意对IDX2 进行范围扫描。 看看Index Monitoring,这应该会告诉你是否使用了索引。 【参考方案1】:

索引分区键是多余的,因为分区修剪将有效地“索引”该字段,并且修剪发生在任何索引读取之前。此时,跳过扫描将正常运行,前提是优化器不会对跳过扫描评分高于完整分区扫描。

【讨论】:

【参考方案2】:

假设您有一个查询只指定了skustr,那么idx2不是多余的。

使用idx1,您还有至少 52 周 x ?? (不知道pd 是什么...)= 52 个或更多索引子树供INDEX SKIP SCAN 浏览,每个分区

idx1 上的 INDEX SKIP SCAN 将执行 52 次以上的索引探测。 INDEX RANGE SCAN 上的 idx2 将针对每个分区进行一次探测(您可以通过将其设为全局索引将其减少到 1 个整体探测)。

所以,idx2 提供了好处。这些好处是否证明表上第二个索引的成本是合理的,取决于您的使用模式(写入与读取)和性能目标。

【讨论】:

以上是关于Oracle 分区和本地 Indexex (12c)的主要内容,如果未能解决你的问题,请参考以下文章

Oracle12c:自动分区表

Oracle动态创建时间分区,以及Oracle12c中快速创建自增列

Oracle12c中性能优化&功能增强新特性之全局索引DROP和TRUNCATE 分区的异步维护

在 oracle sql 12c 中可以绕过分区吗?

如何在Oracle 12C中添加多个分区 (Doc ID 1482456.1)

Oracle 12C 新特性之move (非分区表)table online