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関数を使用してパーティション分割され、合計4つのパーティション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を照会し、所有者が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参照してください。