COPY_TABLE_STATS プロシージャは、ソースパーティション(またはサブパーティション)の統計情報をターゲットパーティション(またはサブパーティション)にコピーします。
機能の適用範囲
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
構文
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以外の場合:- ターゲットパーティションの最大値と最小値は、ターゲットパーティションの上界に設定されます。
ターゲットパーティションが最初のパーティションではない場合:
ターゲットパーティションが単一列パーティションキーの場合:
ソースパーティションにソースパーティションの下界に等しい値が1つしかなく、かつターゲットパーティションの上界が
MAXVALUE以外の場合、ターゲットパーティションの最大値と最小値はどちらもターゲットパーティションの下界に設定されます。それ以外の場合:
- ターゲットパーティションの上界が
MAXVALUEの場合、最大値と最小値はどちらもターゲットパーティションの下界(つまり、前のパーティションの上界)に設定されます。 - ターゲットパーティションの上界が
MAXVALUE以外の場合、最大値はターゲットパーティションの上界に、最小値はターゲットパーティションの下界に設定されます。
- ターゲットパーティションの上界が
ターゲットパーティションが複数列パーティションキーの場合:
ソースパーティションにソースパーティションの下界に等しい値が1つしかなく、かつその値がソースパーティションの下界に等しい場合、ターゲットパーティションの最大値と最小値はどちらもターゲットパーティションの下界に設定されます。
それ以外の場合、現在の列 C について前述のルールを適用し、後続の列 Cx については以下のようにします:
- Cx-1 がターゲットパーティションとその前のパーティションの
MAXVALUEと同じ場合、ターゲットパーティションの最大値はターゲットパーティションの上界に設定されます。 - それ以外の場合、ターゲットパーティション列の最大値は、ターゲットパーティションの上限とソースパーティション列の最大値のうち大きい方に設定されます。
- Cx-1 がターゲットパーティションとその前のパーティションの
例
HASHパーティションテーブル test_copy_tbl1 を作成し、関連する統計情報操作を実行します。
(オプション)
test_copy_tbl1という名前のテーブルが存在する場合は、以下のステートメントを実行して削除します。DROP TABLE test_copy_tbl1;以下のステートメントを実行して、
test_copy_tbl1という名前のテーブルを作成します。このテーブルには、2つの整数列col1とcol2が含まれ、col1に基づいてHASH関数でパーティション分割され、p1、p2、p3、p4の4つのパーティションに分かれます。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を照会し、所有者がSYSで名前がTEST_COPY_TBL1のテーブルのすべてのパーティションに関する統計情報を取得します。これには、テーブル名、パーティション名、行数、ブロック数、平均行長、統計タイプがロックされているかどうか、統計情報が古くなっているかどうか、および最終分析時間が含まれます。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を照会し、所有者がSYSで名前がTEST_COPY_TBL1のテーブルのパーティション列統計情報を取得し、パーティション名と列名でソートします。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を照会し、所有者がSYSで名前がTEST_COPY_TBL1のテーブルのパーティション列ヒストグラム情報を取得し、パーティション名と列名でソートします。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を参照してください。