oceanbase创建的二级分区表,分区键还需要显示创建索引吗?索引执行时是否默认使用分区键?在执行计划中是如何显示算子的?
1 个赞
根据文档库中的信息,以下是关于 OceanBase 索引和分区表的相关解答:
1. 分区键是否需要显式创建索引
- 根据文档信息(参考:分区表设计 和 使用限制),OceanBase 数据库的分区表主键和唯一键不需要单独建索引。这是因为 OceanBase 数据库会自动为主键生成主键索引。
- 如果是分区表的唯一索引,则局部的唯一索引必须包含表分区的分区键(参考:索引概述)。因此,分区键本身并不需要显式创建索引,但如果是局部唯一索引,则需要显式包含分区键。
2. 索引执行时是否默认使用分区键
- 在查询时,如果 SQL 带上了拆分键(即分区键),OceanBase 数据库会根据条件进行分区裁剪,只搜索特定的分区(参考:分区表的索引)。
- 对于全局索引(
GLOBAL
),由于其覆盖整个分区表的数据,查询时不会直接依赖分区键进行分区裁剪,而是通过索引本身的结构来加速查询。 - 对于本地索引(
LOCAL
),查询时会优先利用分区键进行分区裁剪,从而提升查询性能。
3. 执行计划中如何显示算子
- 在 OceanBase 的执行计划中,分区裁剪的信息通常会以
PARTITION RANGE ITERATOR
或类似的算子形式显示。具体来说:- 如果查询条件中包含了分区键,并且能够触发分区裁剪,则执行计划中会明确显示哪些分区被访问。
- 如果没有使用分区键,或者查询条件无法触发分区裁剪,则可能会显示全表扫描或全分区扫描的算子。
- 示例执行计划片段可能如下:
上述示例中,EXPLAIN SELECT * FROM t_log_part_by_range_hash WHERE log_date = '2023-01-01'; +---------------------------------------------+ | ID | OPERATION | NAME | +---------------------------------------------+ | 1 | PARTITION RANGE ITERATOR | p1 | | 2 | TABLE ACCESS BY LOCAL INDEX ROWID| t_log_part_by_range_hash | +---------------------------------------------+
PARTITION RANGE ITERATOR
显示了分区裁剪的结果,仅访问了符合条件的分区p1
。
总结
- 分区键本身不需要显式创建索引,但局部唯一索引需要显式包含分区键。
- 查询时,默认会利用分区键进行分区裁剪,前提是查询条件中包含分区键。
- 执行计划中,分区裁剪的结果会以
PARTITION RANGE ITERATOR
等算子形式显示。
如果您需要更详细的执行计划分析,可以结合实际的 SQL 查询和 EXPLAIN
语句进一步观察。
详情请参考:
1 个赞
不需要显示创建
好详细