パーティション統計のコピー
パーティション表の任意のパーティション/サブパーティションから、別のパーティション/サブパーティションに統計情報をコピーできる。
新規パーティションを追加し、データ投入後に対象パーティションに統計情報収集すると時間を要する場合があります。
パーティション毎のデータ量に偏りがないのであれば、既存パーティションの統計情報をコピーした方が早いことが多いです。
実行例
SQL> CREATE TABLE T1 (C1 NUMBER, C2 VARCHAR2(10), C3 DATE, CONSTRAINT PK_T1 PRIMARY KEY (C1)) PARTITION BY HASH (C1) ( PARTITION T1_P1 , PARTITION T1_P2 , PARTITION T1_P3 , PARTITION T1_P4 ); 2 3 4 5 6 7 8 表が作成されました。 SQL> BEGIN FOR i IN 1..100000 LOOP INSERT INTO t1 VALUES(i, LPAD(TO_CHAR(i), 10, '0'), SYSDATE); END LOOP; COMMIT; END; / 2 3 4 5 6 7 PL/SQLプロシージャが正常に完了しました。 経過: 00:00:07.43 SQL> alter session set max_dump_file_size = UNLIMITED; セッションが変更されました。 経過: 00:00:00.01 SQL> alter session set timed_statistics=true; セッションが変更されました。 経過: 00:00:00.00 SQL> alter session set tracefile_identifier='gather'; セッションが変更されました。 経過: 00:00:00.00 SQL> alter session set events '10046 trace name context forever, level 16'; セッションが変更されました。 経過: 00:00:00.03 SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT','T1',PARTNAME =>'T1_P1',GRANULARITY=>'ALL'); PL/SQLプロシージャが正常に完了しました。 経過: 00:00:02.65 SQL> alter session set events '10046 trace name context off'; セッションが変更されました。 経過: 00:00:00.00 SQL> SELECT NUM_ROWS,AVG_ROW_LEN,BLOCKS,PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='T1'; 2 3 NUM_ROWS AVG_ROW_LEN BLOCKS PARTITION_NAME ---------- ----------- ---------- -------------------- 24945 24 1006 T1_P1 T1_P2 T1_P3 T1_P4 経過: 00:00:00.10 SQL> alter session set max_dump_file_size = UNLIMITED; alter session set timed_statistics=true; alter session set tracefile_identifier='copy'; alter session set events '10046 trace name context forever, level 16'; セッションが変更されました。 SQL> セッションが変更されました。 SQL> セッションが変更されました。 SQL> セッションが変更されました。 SQL> SQL> set timing on SQL> EXEC DBMS_STATS.COPY_TABLE_STATS('SCOTT','T1','T1_P1','T1_P2'); PL/SQLプロシージャが正常に完了しました。 経過: 00:00:00.29 SQL> alter session set events '10046 trace name context off'; セッションが変更されました。 経過: 00:00:00.00 SQL> SELECT NUM_ROWS,AVG_ROW_LEN,BLOCKS,PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='T1'; 2 3 NUM_ROWS AVG_ROW_LEN BLOCKS PARTITION_NAME ---------- ----------- ---------- -------------------- 24945 24 1006 T1_P1 24945 24 1006 T1_P2 T1_P3 T1_P4 経過: 00:00:00.00
T1_P1の統計情報がT1_P2にコピーされている
SQLトレース
gather
$ cat orcl1_ora_26006_gather.txt OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 2 0.01 0.02 3 38 0 0 Execute 2 0.23 0.26 14 220 17 1 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 4 0.24 0.29 17 258 17 1 Misses in library cache during parse: 1 OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 274 0.22 0.24 2 199 10 0 Execute 993 1.45 1.72 77 1548 380 57 Fetch 1247 0.36 0.38 33 4028 0 1934 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 2514 2.04 2.35 112 5775 390 1991 Misses in library cache during parse: 143 Misses in library cache during execute: 126 12 user SQL statements in session. 230 internal SQL statements in session. 242 SQL statements in session.
copy
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 2 0.00 0.00 0 0 0 0 Execute 2 0.04 0.06 0 9 3 1 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 4 0.04 0.06 0 9 3 1 Misses in library cache during parse: 1 OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 53 0.03 0.03 0 36 0 0 Execute 99 0.15 0.16 0 20 62 10 Fetch 179 0.00 0.00 0 308 0 174 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 331 0.19 0.20 0 364 62 184 Misses in library cache during parse: 5 Misses in library cache during execute: 3 4 user SQL statements in session. 52 internal SQL statements in session. 56 SQL statements in session.
新規で統計情報を収集するより、既存のパーティションの統計情報をコピーした方がコストが低いことが多い