【发布时间】:2017-11-14 04:27:15
【问题描述】:
我在 Oracle 12c 中有一个 500M 记录的表。 表按 1 个 varchar 列进行分区,并按其他 varchar 列进行子分区。
在 Where 子句中使用这 2 列的查询应该使用哪些索引?
我假设本地分区索引是最佳选择,但想更深入地了解何时出现这种情况以及如何最好地创建它们?
【问题讨论】:
标签: sql oracle indexing partition
我在 Oracle 12c 中有一个 500M 记录的表。 表按 1 个 varchar 列进行分区,并按其他 varchar 列进行子分区。
在 Where 子句中使用这 2 列的查询应该使用哪些索引?
我假设本地分区索引是最佳选择,但想更深入地了解何时出现这种情况以及如何最好地创建它们?
【问题讨论】:
标签: sql oracle indexing partition
Oracle 能够partition pruning,这意味着如果您的查询在 where 子句中有分区键列,Oracle 足够聪明,只查询那些相关的分区。在这种情况下,local partitioned index 更有利,因为它是“分区本地的”,即索引也以相同的方式分区,Oracle 只会读取相关分区的相关索引条目。
但是,如果您的查询在 where 子句中没有分区键列,则 Oracle 无法应用分区修剪并且别无选择,只能扫描所有 local partitioned indexes,或者,最坏的情况,整个表的数据。这就是全局分区索引将在 where 子句中的那些列上派上用场的地方。在这种情况下,Oracle 会在跨分区的这些列上创建一个索引,并且确切地知道要从哪些分区中读取哪些记录符合语句的 where 子句。
【讨论】: