首批通过分布式安全可靠测评,为关键业务系统打造
SET_BALANCE_WEIGHT
更新时间:2026-07-15 20:56:58
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 操作(Oracle 模式)。
语法
DBMS_BALANCE.SET_BALANCE_WEIGHT(
weight IN BINARY_INTEGER,
schema_name IN VARCHAR2,
table_name IN VARCHAR2,
partition_name IN VARCHAR2 DEFAULT NULL,
subpartition_name IN VARCHAR2 DEFAULT NULL);
参数说明
| 参数 | 说明 |
|---|---|
| weight | 分区权重,即分区之间占用资源(CPU、内存、磁盘等)的相对比重。取值范围为 [1, +∞)。 |
| schema_name | 表所属的 Schema 名 |
| table_name | 表名 |
| partition_name | 一级分区名 |
| subpartition_name | 二级分区名。仅语法支持,当前暂不支持设置二级分区权重。 |
示例
假设用户
USR2创建了一个 Hash 分区表TBL1_H。obclient[USR2]> CREATE TABLE TBL1_H(col1 INT,col2 VARCHAR(50)) PARTITION BY HASH(col1) PARTITIONS 5;查看该表的分区信息,语句如下。
obclient[USR2]> SELECT TABLE_NAME, PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'TBL1_H';得到的具体分区信息如下:
+------------+----------------+ | TABLE_NAME | PARTITION_NAME | +------------+----------------+ | TBL1_H | P4 | | TBL1_H | P3 | | TBL1_H | P2 | | TBL1_H | P1 | | TBL1_H | P0 | +------------+----------------+ 5 rows in set设置表
TBL1_H的表级分区权重为 1。obclient [USR2]> delimiter //obclient[USR2]> BEGIN DBMS_BALANCE.SET_BALANCE_WEIGHT(1,'USR2','TBL1_H'); END;//obclient [USR2]> delimiter ;设置表
TBL1_H的表级分区权重后,查询表设置过的分区权重信息。obclient[USR2]> SELECT * FROM SYS.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 | USR2 | TBL1_H | NULL | NULL | NULL | 201006 | NULL | 500002 | +----------+--------------+-----------------+--------+---------------+------------+----------------+-------------------+-----------------+-------------+---------------+-----------+ 1 row in set再设置表
TBL1_H中一级分区P0的分区权重为 2。obclient [USR2]> delimiter //obclient[USR2]> BEGIN DBMS_BALANCE.SET_BALANCE_WEIGHT(2,'USR2','TBL1_H','P0'); END;//obclient [USR2]> delimiter ;再次查询表设置过的分区权重信息。
obclient[USR2]> obclient[USR2]> SELECT * FROM SYS.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 | USR2 | TBL1_H | NULL | NULL | NULL | 201006 | NULL | 500002 | | 500002 | 500003 | NULL | 2 | USR2 | TBL1_H | P0 | NULL | NULL | 201006 | NULL | 500003 | +----------+--------------+-----------------+--------+---------------+------------+----------------+-------------------+-----------------+-------------+---------------+-----------+ 2 rows in set