首批通过分布式安全可靠测评,为关键业务系统打造
partition_index_dive_limit
更新时间:2026-04-16 00:11:37
说明
在 V4.2.x 版本中,该变量从 V4.2.5、V4.2.1 BP9 版本引入。
功能描述
partition_index_dive_limit 用于指示优化器使用存储层估行时分区数量限制。
权限要求
- 查询变量
- Global 级别 sys 租户和所有用户租户均可以使用
SHOW VARIABLES语句或视图SYS.TENANT_VIRTUAL_GLOBAL_VARIABLE(Oracle 模式)及视图information_schema.GLOBAL_VARIABLES(MySQL 模式)查看 Global 系统变量的值。 - Session 级别 sys 租户和所有用户租户均可以使用
SHOW VARIABLES语句或视图SYS.TENANT_VIRTUAL_SESSION_VARIABLE(Oracle 模式)及视图information_schema.SESSION_VARIABLES(MySQL 模式)查看 Session 系统变量的值。
- Global 级别 sys 租户和所有用户租户均可以使用
- 修改变量
- Global 生效
- sys 租户可以直接修改 Global 系统变量的值。
- MySQL 用户租户需要拥有
SUPER或ALTER SYSTEM权限才能修改 Global 系统变量的值。 - 对于 V4.x 版本,从 V4.2.0 版本开始,Oracle 用户租户需要拥有
ALTER SYSTEM权限才能修改 Global 系统变量的值。
- Session 生效 sys 租户和所有用户租户均可以直接修改本租户的 Session 系统变量的值。
- Global 生效
属性说明
| 属性 | 描述 |
|---|---|
| 参数类型 | int |
| 默认值 | 10 |
| 取值范围 | [0, INT64_MAX]
说明其中:
|
| 生效范围 | Global/Session |
| 是否可修改 | 是 |
使用说明
修改该变量以控制优化器存储层估行时的分区数量限制:
- 当分区个数小于该变量时,总是选择所有分区做存储层估行。
- 当分区个数大于等于该变量时,随机选择
partition_index_dive_limit个分区进行存储层估行,并将估行结果等比例放大。 - 当该变量为
0时,总是选择所有分区做存储层估行。 - 当
range_index_dive_limit与partition_index_dive_limit同为负数时,存储层估行策略回滚到 V4.2.5 以前的版本,仅对单分区 10 个 range 以内做存储层估行,超过时也不会采样。
配置示例
创建表并插入数据。
obclient> CREATE TABLE t11(c1 int, c2 int, index i1(c2)) PARTITION BY range(c1) (partition p0 values less than(10), partition p1 values less than(20), partition p2 values less than(30)); Query OK, 0 rows affected (0.112 sec) obclient> INSERT INTO t11 SELECT 1,1 FROM table(generator(10)); Query OK, 10 rows affected (0.007 sec) Records: 10 Duplicates: 0 Warnings: 0 obclient> INSERT INTO t11 SELECT 11,11 FROM table(generator(20)); Query OK, 20 rows affected (0.003 sec) Records: 20 Duplicates: 0 Warnings: 0 obclient> INSERT INTO t11 SELECT 21,21 FROM table(generator(30)); Query OK, 30 rows affected (0.003 sec) Records: 30 Duplicates: 0 Warnings: 0查看执行计划,默认场景下不超过 10 个分区均采用存储层估行。
obclient [test]> EXPLAIN SELECT c1 FROM t11 WHERE c2 in (1,11,21); +---------------------------------------------------------------------------------------------------------------+ | Query Plan | +---------------------------------------------------------------------------------------------------------------+ | ============================================================= | | |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| | | ------------------------------------------------------------- | | |0 |PX COORDINATOR | |60 |253 | | | |1 |└─EXCHANGE OUT DISTR |:EX10000|60 |234 | | | |2 | └─PX PARTITION ITERATOR| |60 |193 | | | |3 | └─TABLE RANGE SCAN |t11(i1) |60 |193 | | | ============================================================= | | Outputs & filters: | | ------------------------------------- | | 0 - output([INTERNAL_FUNCTION(t11.c1)]), filter(nil), rowset=256 | | 1 - output([INTERNAL_FUNCTION(t11.c1)]), filter(nil), rowset=256 | | dop=1 | | 2 - output([t11.c1]), filter(nil), rowset=256 | | force partition granule | | 3 - output([t11.c1]), filter(nil), rowset=256 | | access([t11.__pk_increment], [t11.c1]), partitions(p[0-2]) | | is_index_back=true, is_global_index=false, | | range_key([t11.c2], [t11.__pk_increment]), range(1,MIN ; 1,MAX), (11,MIN ; 11,MAX), (21,MIN ; 21,MAX), | | range_cond([t11.c2 IN (1, 11, 21)]) | +---------------------------------------------------------------------------------------------------------------+ 20 rows in set (0.007 sec)修改变量,仅选择 1 个分区做存储层估行。
obclient [test]> SET partition_index_dive_limit = 1; Query OK, 0 rows affected (0.000 sec)查看执行计划,发现仅选择了一个分区做存储层估行,估行结果为
10 * 3 = 30。obclient [test]> EXPLAIN SELECT c1 FROM t11 WHERE c2 in (1,11,21); +---------------------------------------------------------------------------------------------------------------+ | Query Plan | +---------------------------------------------------------------------------------------------------------------+ | ============================================================= | | |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| | | ------------------------------------------------------------- | | |0 |PX COORDINATOR | |30 |148 | | | |1 |└─EXCHANGE OUT DISTR |:EX10000|30 |139 | | | |2 | └─PX PARTITION ITERATOR| |30 |118 | | | |3 | └─TABLE RANGE SCAN |t11(i1) |30 |118 | | | ============================================================= | | Outputs & filters: | | ------------------------------------- | | 0 - output([INTERNAL_FUNCTION(t11.c1)]), filter(nil), rowset=256 | | 1 - output([INTERNAL_FUNCTION(t11.c1)]), filter(nil), rowset=256 | | dop=1 | | 2 - output([t11.c1]), filter(nil), rowset=256 | | force partition granule | | 3 - output([t11.c1]), filter(nil), rowset=256 | | access([t11.__pk_increment], [t11.c1]), partitions(p[0-2]) | | is_index_back=true, is_global_index=false, | | range_key([t11.c2], [t11.__pk_increment]), range(1,MIN ; 1,MAX), (11,MIN ; 11,MAX), (21,MIN ; 21,MAX), | | range_cond([t11.c2 IN (1, 11, 21)]) | +---------------------------------------------------------------------------------------------------------------+ 20 rows in set (0.003 sec)