首批通过分布式安全可靠测评,为关键业务系统打造
SET_BALANCE_WEIGHT
更新时间:2026-07-15 20:42:47
SET_BALANCE_WEIGHT 用于设置分区权重。按照级别从上到下,支持设置表级、分区级的分区权重。
使用限制及注意事项
对于 V4.2.5 版本,从 V4.2.5 BP2 版本开始支持手动设置分区权重。
仅用户租户支持手动设置分区权重,系统租户不支持设置分区权重。
当前仅支持对非分区表、以及分区表的分区设置分区权重,暂不支持对二级分区设置分区权重。
仅支持对已存在的实体分区设置权重,不支持在建表时指定权重,即需要先创建表后,再为表设置分区权重。
分区权重仅支持整数,取值范围为 [1, +∞)。默认情况下,分区没有权重。
设置分区权重时,建议分区权重的档位尽量少,建议最多划分三挡:
大权重 = 100% * 分区数
中权重 = 50% * 分区数
小权重 = 1
对于不需要参与权重均衡的分区表,建议不要设置分区权重。
设置分区权重时,下级分区默认继承上级分区权重。如果同时对多个级别设置了分区权重,则下级权重将覆盖上级权重。
设置分区权重后,如果用户执行了 Offline DDL 操作(例如 Truncate Table、Truncate Partition 等操作)导致分区实体发生变化,原来设置的分区权重也会失效,需要用户重新设置分区权重。可能会导致分区权重失效的 Offline DDL 参见 Online DDL 和 Offline DDL 操作(MySQL 模式)。
语法
DBMS_BALANCE.SET_BALANCE_WEIGHT(
weight INT,
database_name VARCHAR(65535),
table_name VARCHAR(65535),
partition_name VARCHAR(65535) DEFAULT NULL,
subpartition_name VARCHAR(65535) DEFAULT NULL);
参数说明
| 参数 | 说明 |
|---|---|
| weight | 分区权重,即分区之间占用的 CPU、内存、磁盘等资源的相对比重。仅支持整数,取值范围为 [1, +∞)。 |
| database_name | 表所属的数据库名 |
| table_name | 表名 |
| partition_name | 一级分区名 |
| subpartition_name | 二级分区名。仅语法支持,当前暂不支持设置二级分区权重。 |
示例
假设用户在
test数据库下,创建了一个 Hash 分区表tbl1_h。obclient[test]> CREATE TABLE tbl1_h(col1 INT,col2 VARCHAR(50)) PARTITION BY HASH(col1) PARTITIONS 5;查看该表的分区信息。
obclient[test]> SELECT TABLE_NAME, PARTITION_NAME FROM information_schema.PARTITIONS WHERE TABLE_NAME ='tbl1_h';得到的具体分区信息如下:
+------------+----------------+ | TABLE_NAME | PARTITION_NAME | +------------+----------------+ | tbl1_h | p0 | | tbl1_h | p3 | | tbl1_h | p2 | | tbl1_h | p4 | | tbl1_h | p1 | +------------+----------------+ 5 rows in set设置表
tbl1_h的表级分区权重为 1。obclient[test]> CALL DBMS_BALANCE.SET_BALANCE_WEIGHT(1,'test','tbl1_h');仅设置表
tbl1_h的表级分区权重后,查询表设置过的分区权重信息。obclient[oceanbase]> SELECT * FROM oceanbase.DBA_OB_OBJECT_BALANCE_WEIGHT;结果如下:
+----------+--------------+-----------------+--------+---------------+------------+----------------+-------------------+-----------------+-------------+---------------+-----------+ | TABLE_ID | PARTITION_ID | SUBPARTITION_ID | WEIGHT | DATABASE_NAME | TABLE_NAME | PARTITION_NAME | SUBPARTITION_NAME | TABLEGROUP_NAME | DATABASE_ID | TABLEGROUP_ID | OBJECT_ID | +----------+--------------+-----------------+--------+---------------+------------+----------------+-------------------+-----------------+-------------+---------------+-----------+ | 500002 | NULL | NULL | 1 | test | tbl1_h | NULL | NULL | NULL | 500001 | NULL | 500002 | +----------+--------------+-----------------+--------+---------------+------------+----------------+-------------------+-----------------+-------------+---------------+-----------+ 1 row in set再设置表
tbl1_h中一级分区p0的分区权重为 2。obclient[test]> CALL DBMS_BALANCE.SET_BALANCE_WEIGHT(2,'test','tbl1_h','p0');再次查询表设置过的分区权重信息。
obclient[oceanbase]> SELECT * FROM oceanbase.DBA_OB_OBJECT_BALANCE_WEIGHT;结果如下:
+----------+--------------+-----------------+--------+---------------+------------+----------------+-------------------+-----------------+-------------+---------------+-----------+ | TABLE_ID | PARTITION_ID | SUBPARTITION_ID | WEIGHT | DATABASE_NAME | TABLE_NAME | PARTITION_NAME | SUBPARTITION_NAME | TABLEGROUP_NAME | DATABASE_ID | TABLEGROUP_ID | OBJECT_ID | +----------+--------------+-----------------+--------+---------------+------------+----------------+-------------------+-----------------+-------------+---------------+-----------+ | 500002 | NULL | NULL | 1 | test | tbl1_h | NULL | NULL | NULL | 500001 | NULL | 500002 | | 500002 | 500003 | NULL | 2 | test | tbl1_h | p0 | NULL | NULL | 500001 | NULL | 500003 | +----------+--------------+-----------------+--------+---------------+------------+----------------+-------------------+-----------------+-------------+---------------+-----------+ 2 rows in set