首批通过分布式安全可靠测评,为关键业务系统打造
COPY_TABLE_STATS
更新时间:2026-06-01 18:07:44
COPY_TABLE_STATS 过程用于将源分区(或子分区)的统计信息复制到目标分区(或子分区)。
功能适用性
该内容仅适用于 OceanBase 数据库企业版。OceanBase 数据库社区版暂不支持。
语法
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 | 指定源和目标分区(或子分区)所在表的模式(用户)名称。 |
| tabname | 指定源和目标分区(或子分区)所对应的表的名称。 |
| srcpartname | 指定要复制统计信息的源分区(或子分区)。 |
| dtspartname | 指定接收统计信息的目标分区(或子分区)。 |
| scale_factor | 在复制到目标分区(或子分区)时,用于按比例调整 nblks(块数)、nrows(行数)等统计属性的数值。 |
| flags | 默认为 NULL。一般用户无需设置。 |
| force | 默认为 FALSE。若该参数值设为 TRUE,即使目标分区(或子分区)当前处于锁定状态,仍会继续执行统计信息的复制操作。 |
异常情况
| 错误码 | 描述 |
|---|---|
| OBE-20000 | 表示分区名称无效。 |
| OBE-20001 | 表示源分区和目标分区类型不同。 |
使用说明
该过程按照以下方式更新目标分区中的最小值和最大值:
如果分区类型为 HASH,则目标分区的最小值和最大值与源分区的相同。
如果分区类型为 LIST,则行为取决于目标分区的设置:
若目标分区是 DEFAULT 分区,则:
- 目标分区的最小值设置为源分区的最小值。
- 目标分区的最大值设置为源分区的最大值。
如果目标分区是一个 NOT DEFAULT 分区,则:
- 目标分区的最小值设置为描述目标分区的值列表中的最小值。
- 目标分区的最大值设置为描述目标分区的值列表中的最大值。
如果分区类型为 RANGE,则:
若目标分区是第一个分区,则:
若目标分区的上界是
MAXVALUE,则:- 目标分区和源分区是同一个分区,无需拷贝或更新最小值和最大值,即它的最小值和最大值不需要设置。
若目标分区的上界不是
MAXVALUE,则:- 目标分区的最大值最小值都会被设置为目标分区的上界。
若目标分区不是第一个分区,则:
若目标分区是单列分区键,则:
若源分区只有一个值且等于源分区的下边界,并且目标分区的上界不是
MAXVALUE,则目标分区的最大值和最小值都设置为目标分区的下边界。否则:
- 若目标分区的上界是
MAXVALUE,则最大值和最小值都设置成目标分区的下边界(也就是前一个分区的上边界)。 - 若目标分区的上界不是
MAXVALUE,则最大值设置成目标分区的上边界,最小值设置成目标分区的下边界。
- 若目标分区的上界是
若目标分区是多列分区键,则:
若源分区只有一个值且等于源分区的下边界,则目标分区的最大值和最小值都设置为目标分区的下边界。
否则,当前列 C 采用前述规则,对于后续列 Cx,则:
- Cx-1 在目标分区和目标分区之前的
MAXVALUE相同,则目标分区的最大值设置为目标分区的上边界。 - 否则,目标分区列的最大值设置为目标分区上限和源分区列最大值中的较大值。
- Cx-1 在目标分区和目标分区之前的
示例
创建一个 HASH 分区表 test_copy_tbl1 并执行相关的统计信息操作。
(可选)如果存在名为
test_copy_tbl1的表,那么执行下面语句删除它。DROP TABLE test_copy_tbl1;执行下面语句,创建一个名为
test_copy_tbl1的表,包含两个整数列col1和col2,并通过 HASH 函数对col1进行分区,共分为四个分区:p1、p2、p3和p4。CREATE TABLE test_copy_tbl1(col1 INT, col2 INT) PARTITION BY HASH(col1) (PARTITION p1, PARTITION p2, PARTITION p3, PARTITION p4);执行下面语句,向
test_copy_tbl1表中插入 10 行数据,其中col1列依次为 1 到 10,而col2列则为 2 到 11。INSERT INTO test_copy_tbl1 SELECT level, level + 1 FROM dual CONNECT BY LEVEL <= 10;返回结果如下:
Query OK, 10 rows affected (0.060 sec) Records: 10 Duplicates: 0 Warnings: 0执行下面语句,调用
DBMS_STATS包中的gather_table_stats过程收集名为test_copy_tbl1的表中名为P1的分区的统计信息。method_opt参数指定所有列的直方图大小为 32 桶。CALL dbms_stats.gather_table_stats('SYS','TEST_COPY_TBL1', 'P1', method_opt=>'for all columns size 32');执行下面语句,调用
DBMS_STATS包中的copy_table_stats过程,将名为test_copy_tbl1表中P1分区的统计信息按比例因子 2 复制到P2分区。CALL dbms_stats.copy_table_stats('SYS','TEST_COPY_TBL1','P1','P2', scale_factor=>2);执行下面语句,查询视图
all_tab_statistics,获取名为TEST_COPY_TBL1且所有者为SYS的表的所有分区的相关统计信息,包括表名、分区名、行数、块数、平均行长度、是否锁定统计类型、统计信息是否过时以及最后分析时间。SELECT table_name, partition_name, num_rows, blocks, avg_row_len, stattype_locked locked, stale_stats, last_analyzed FROM all_tab_statistics WHERE table_name = 'TEST_COPY_TBL1' AND owner = 'SYS';返回结果如下:
+----------------+----------------+----------+--------+-------------+--------+-------------+---------------+ | TABLE_NAME | PARTITION_NAME | NUM_ROWS | BLOCKS | AVG_ROW_LEN | LOCKED | STALE_STATS | LAST_ANALYZED | +----------------+----------------+----------+--------+-------------+--------+-------------+---------------+ | TEST_COPY_TBL1 | NULL | 10 | NULL | 40 | NULL | NO | 08-JAN-24 | | TEST_COPY_TBL1 | P1 | 2 | NULL | 40 | NULL | NO | 08-JAN-24 | | TEST_COPY_TBL1 | P2 | 4 | NULL | 40 | NULL | NO | 08-JAN-24 | | TEST_COPY_TBL1 | P3 | NULL | NULL | NULL | NULL | NULL | NULL | | TEST_COPY_TBL1 | P4 | NULL | NULL | NULL | NULL | NULL | NULL | +----------------+----------------+----------+--------+-------------+--------+-------------+---------------+ 5 rows in set更多有关视图
all_tab_statistics的详细信息,请参见 ALL_TAB_STATISTICS。执行下面语句,查询视图
all_part_col_statistics,获取名为TEST_COPY_TBL1且所有者为SYS的表的分区列统计信息,并按分区名和列名排序。SELECT * FROM all_part_col_statistics WHERE table_name = 'TEST_COPY_TBL1' AND owner = 'SYS' ORDER BY partition_name, column_name;返回结果如下:
+-------+----------------+----------------+-------------+--------------+-----------+------------+---------+-----------+-------------+-------------+---------------+--------------+------------+-------+-------------+-----------+ | OWNER | TABLE_NAME | PARTITION_NAME | COLUMN_NAME | NUM_DISTINCT | LOW_VALUE | HIGH_VALUE | DENSITY | NUM_NULLS | NUM_BUCKETS | SAMPLE_SIZE | LAST_ANALYZED | GLOBAL_STATS | USER_STATS | NOTES | AVG_COL_LEN | HISTOGRAM | +-------+----------------+----------------+-------------+--------------+-----------+------------+---------+-----------+-------------+-------------+---------------+--------------+------------+-------+-------------+-----------+ | SYS | TEST_COPY_TBL1 | P1 | COL1 | 2 | 2 | 7 | .25 | 0 | 2 | 2 | 08-JAN-24 | NO | NO | NULL | 20 | FREQUENCY | | SYS | TEST_COPY_TBL1 | P1 | COL2 | 2 | 3 | 8 | .25 | 0 | 2 | 2 | 08-JAN-24 | NO | NO | NULL | 20 | FREQUENCY | | SYS | TEST_COPY_TBL1 | P2 | COL1 | 2 | 2 | 7 | .25 | 0 | 2 | 2 | 08-JAN-24 | NO | NO | NULL | 20 | FREQUENCY | | SYS | TEST_COPY_TBL1 | P2 | COL2 | 2 | 3 | 8 | .25 | 0 | 2 | 2 | 08-JAN-24 | NO | NO | NULL | 20 | FREQUENCY | | SYS | TEST_COPY_TBL1 | P3 | COL1 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | | SYS | TEST_COPY_TBL1 | P3 | COL2 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | | SYS | TEST_COPY_TBL1 | P4 | COL1 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | | SYS | TEST_COPY_TBL1 | P4 | COL2 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | +-------+----------------+----------------+-------------+--------------+-----------+------------+---------+-----------+-------------+-------------+---------------+--------------+------------+-------+-------------+-----------+ 8 rows in set更多有关视图
all_part_col_statistics的详细信息,请参见 ALL_PART_COL_STATISTICS。执行下面语句,查询视图
all_part_histograms,获取名为TEST_COPY_TBL1且所有者为SYS的表的分区列直方图信息,并按分区名和列名排序。SELECT * FROM all_part_histograms WHERE table_name = 'TEST_COPY_TBL1' AND owner = 'SYS' ORDER BY partition_name, column_name;返回结果如下:
+-------+----------------+----------------+-------------+-----------------+----------------+-----------------------+---------------------------+-----------------------+ | OWNER | TABLE_NAME | PARTITION_NAME | COLUMN_NAME | ENDPOINT_NUMBER | ENDPOINT_VALUE | ENDPOINT_ACTUAL_VALUE | ENDPOINT_ACTUAL_VALUE_RAW | ENDPOINT_REPEAT_COUNT | +-------+----------------+----------------+-------------+-----------------+----------------+-----------------------+---------------------------+-----------------------+ | SYS | TEST_COPY_TBL1 | P1 | COL1 | 2 | NULL | 7 | 7 | 1 | | SYS | TEST_COPY_TBL1 | P1 | COL1 | 1 | NULL | 2 | 2 | 1 | | SYS | TEST_COPY_TBL1 | P1 | COL2 | 2 | NULL | 8 | 8 | 1 | | SYS | TEST_COPY_TBL1 | P1 | COL2 | 1 | NULL | 3 | 3 | 1 | | SYS | TEST_COPY_TBL1 | P2 | COL1 | 2 | NULL | 7 | 7 | 1 | | SYS | TEST_COPY_TBL1 | P2 | COL1 | 1 | NULL | 2 | 2 | 1 | | SYS | TEST_COPY_TBL1 | P2 | COL2 | 2 | NULL | 8 | 8 | 1 | | SYS | TEST_COPY_TBL1 | P2 | COL2 | 1 | NULL | 3 | 3 | 1 | +-------+----------------+----------------+-------------+-----------------+----------------+-----------------------+---------------------------+-----------------------+ 8 rows in set更多有关视图
all_part_histograms的详细信息,请参见 ALL_PART_HISTOGRAMS。