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】:假设您有一个查询只指定了sku
和str
,那么idx2
是不是多余的。
使用idx1
,您还有至少 52 周 x ?? (不知道pd
是什么...)= 52 个或更多索引子树供INDEX SKIP SCAN
浏览,每个分区。
idx1
上的 INDEX SKIP SCAN
将执行 52 次以上的索引探测。 INDEX RANGE SCAN
上的 idx2
将针对每个分区进行一次探测(您可以通过将其设为全局索引将其减少到 1 个整体探测)。
所以,idx2
提供了好处。这些好处是否证明表上第二个索引的成本是合理的,取决于您的使用模式(写入与读取)和性能目标。
【讨论】:
以上是关于Oracle 分区和本地 Indexex (12c)的主要内容,如果未能解决你的问题,请参考以下文章
Oracle动态创建时间分区,以及Oracle12c中快速创建自增列
Oracle12c中性能优化&功能增强新特性之全局索引DROP和TRUNCATE 分区的异步维护