首批通过分布式安全可靠测评,为关键业务系统打造
COPY_TABLE_STATS
更新时间:2026-03-15 20:01:11
COPY_TABLE_STATS 过程用于将源分区(或子分区)的统计信息复制到目标分区(或子分区)。
语法
DBMS_STATS.COPY_TABLE_STATS (
ownname VARCHAR2,
tabname VARCHAR2,
srcpartname VARCHAR2,
dstpartname VARCHAR2,
scale_factor VARCHAR2,
flags NUMBER DEFAULT NULL,
force BOOLEAN DEFAULT FALSE);
参数解释
| 参数 | 说明 |
|---|---|
| ownname | 指定源和目标分区(或子分区)所在表的 Schema 名称。 |
| tabname | 指定源和目标分区(或子分区)所对应的表的名称。 |
| srcpartname | 指定要复制统计信息的源分区(或子分区)。 |
| dstpartname | 指定接收统计信息的目标分区(或子分区)。 |
| scale_factor | 在复制到目标分区(或子分区)时,用于按比例调整 nblks(块数)、nrows(行数)等统计属性的数值。 |
| flags | 默认为 NULL。一般用户无需设置。 |
| force | 默认为 FALSE。若该参数值设为 TRUE,即使目标分区(或子分区)当前处于锁定状态,仍会继续执行统计信息的复制操作。 |
异常情况
| 错误码 | 描述 |
|---|---|
| HY000 | 表示分区名称无效。 |
| HY000 | 表示源分区和目标分区类型不同。 |
使用说明
该过程按照以下方式更新目标分区中的最小值和最大值:
如果分区类型为 HASH,则目标分区的最小值和最大值与源分区的相同。
如果分区类型为 LIST,则行为取决于目标分区的设置:
若目标分区是 DEFAULT 分区,则:
- 目标分区的最小值设置为源分区的最小值。
- 目标分区的最大值设置为源分区的最大值。
如果目标分区是一个 NOT DEFAULT 分区,则:
- 目标分区的最小值设置为描述目标分区的值列表中的最小值。
- 目标分区的最大值设置为描述目标分区的值列表中的最大值。
如果分区类型为 RANGE,则:
若目标分区是第一个分区,则:
若目标分区的上界是
MAXVALUE,则:- 目标分区和源分区是同一个分区,无需拷贝或更新最小值和最大值,即它的最小值和最大值不需要设置。
若目标分区的上界不是
MAXVALUE,则:- 目标分区的最大值最小值都会被设置为目标分区的上界。
若目标分区不是第一个分区,则:
若目标分区是单列分区键,则:
若源分区只有一个值且等于源分区的下边界,并且目标分区的上界不是
MAXVALUE,则目标分区的最大值和最小值都设置为目标分区的下边界。否则:
- 若目标分区的上界是
MAXVALUE,则最大值和最小值都设置成目标分区的下边界(也就是前一个分区的上边界)。 - 若目标分区的上界不是
MAXVALUE,则最大值设置成目标分区的上边界,最小值设置成目标分区的下边界。
- 若目标分区的上界是
若目标分区是多列分区键,则:
若源分区只有一个值且等于源分区的下边界,则目标分区的最大值和最小值都设置为目标分区的下边界。
否则,当前列 C 采用前述规则,对于后续列 Cx,则:
- Cx-1 在目标分区和目标分区之前的
MAXVALUE相同,则目标分区的最大值设置为目标分区的上边界。 - 否则,目标分区列的最大值设置为目标分区上限和源分区列最大值中的较大值。
- Cx-1 在目标分区和目标分区之前的
要调用此过程,您必须是表的所有者。对于 SYS 拥有的对象,需要是表的所有者或具有 SYSDBA 权限才能调用此过程。
示例
创建一个 HASH 分区表 test_copy_tbl1 并执行相关的统计信息操作。
(可选)如果存在名为
test_copy_tbl1的表,那么执行下面语句删除它。DROP TABLE IF EXISTS test_copy_tbl1;执行下面语句,创建一个名为
test_copy_tbl1的表,包含两个整数列col1和col2,并通过 HASH 函数对col1进行分区,共分为四个分区:p0、p1、p2和p3。CREATE TABLE test_copy_tbl1(col1 INT, col2 INT) PARTITION BY HASH(col1) PARTITIONS 4;执行下面语句,向
test_copy_tbl1表中插入数据。INSERT INTO test_copy_tbl1 VALUES (1,2),(2,3),(3,4),(4,5),(5,6),(6,7),(7,8),(8,9),(9,10),(10,11);执行下面语句,调用
DBMS_STATS包中的gather_table_stats过程收集test_copy_tbl1表中p0分区的统计信息。CALL dbms_stats.gather_table_stats(NULL, 'test_copy_tbl1', 'p0', method_opt=>'for all columns size 32');执行下面语句,调用
DBMS_STATS包中的copy_table_stats过程,将test_copy_tbl1表中p0分区的统计信息按比例因子 2 复制到p1分区。CALL dbms_stats.copy_table_stats(NULL, 'test_copy_tbl1', 'p0', 'p1', '2');或使用命名参数方式:
CALL dbms_stats.copy_table_stats(NULL, 'test_copy_tbl1', 'p0', 'p1', scale_factor=>'2');