【Oracle Database】単一レベルパーティションで増分統計収集を行う方法: データベースサポート最前線の現場から(7)(2/2 ページ)
データベース管理システムの運用でトラブルが発生したらどうするか。データベースサポートスペシャリストが現場目線の解決Tipsをお届けします。今回は時間とリソースを抑えられる、「Oracle Databaseの単一レベルパーティションで増分統計集計を行う方法」を紹介します。
増分統計収集の実行
まず、表全体の統計情報を収集しておきます。
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS( ownname => 'TAONO', - > tabname => 'PART_TAB', - > estimate_percent => dbms_stats.auto_sample_size, - > granularity => 'AUTO', - > no_invalidate => false); PL/SQLプロシージャが正常に完了しました。 SQL> SELECT 2 table_name,partition_name,subpartition_name, 3 object_type,global_stats,last_analyzed 4 FROM user_tab_statistics WHERE table_name = 'PART_TAB'; TABLE_NAME PARTITION_NAME SUBPARTITION_NAME OBJECT_TYP GLOBAL_ST LAST_ANALYZED ---------- -------------- ----------------- ---------- --------- ------------------- PART_TAB TABLE YES 2015-06-17 21:34:54 PART_TAB DATE_P_2013 PARTITION YES 2015-06-17 21:34:54 PART_TAB DATE_P_2014 PARTITION YES 2015-06-17 21:34:54 PART_TAB DATE_P_2015 PARTITION YES 2015-06-17 21:34:54
表全体で取得したため、LAST_ANALYZED列の値(最後に統計情報を収集した日付)は全パーティションで同じです。
続いて、「DATE_P_2015」パーティションにのみデータを投入します。
SQL> SELECT count(*) FROM part_tab PARTITION(DATE_P_2015); COUNT(*) ---------- 1 SQL> INSERT INTO part_tab VALUES(1,to_date('2015-01-01','YYYY-MM-DD')); SQL> INSERT INTO part_tab VALUES(2,to_date('2015-01-02','YYYY-MM-DD')); SQL> INSERT INTO part_tab VALUES(3,to_date('2015-01-03','YYYY-MM-DD')); SQL> INSERT INTO part_tab VALUES(4,to_date('2015-01-04','YYYY-MM-DD')); SQL> COMMIT; コミットが完了しました。 SQL> SELECT count(*) FROM part_tab PARTITION(DATE_P_2015); COUNT(*) ---------- 5
これで準備が済みました。ESTIMATE_PERCENTに「AUTO_SAMPLE_SIZE」、GRANULARITYに「AUTO」を指定し、増分統計収集を実行してみましょう。
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS( ownname => 'TAONO', - > tabname => 'PART_TAB', - > estimate_percent => dbms_stats.auto_sample_size, - > granularity => 'AUTO', - > no_invalidate => false); PL/SQLプロシージャが正常に完了しました。 SQL> SELECT 2 table_name,partition_name,subpartition_name, 3 object_type,global_stats,last_analyzed 4 FROM user_tab_statistics WHERE table_name = 'PART_TAB'; TABLE_NAME PARTITION_NAME SUBPARTITION_NAME OBJECT_TYP GLOBAL_ST LAST_ANALYZED ---------- -------------- ----------------- ---------- --------- ------------------- PART_TAB TABLE YES 2015-06-17 21:48:22 PART_TAB DATE_P_2013 PARTITION YES 2015-06-17 21:34:54 PART_TAB DATE_P_2014 PARTITION YES 2015-06-17 21:34:54 PART_TAB DATE_P_2015 PARTITION YES 2015-06-17 21:48:22 <--
データを投入した「DATE_P_2015」パーティションと表のLAST_ANALYZED列が更新され、増分で統計が収集されたことが分かります。今回はAUTOで実行しましたが、 GRANULARITYにGLOBALが含まれていれば、増分統計収集が実行されます(AUTO/ALL/GLOBAL/GLOBAL AND PARTITION/APPROX_GLOBAL AND PARTITION)。
増分統計収集では表全体のスキャンは実行していませんが、PART_TAB表のGLOBAL_STATSは「YES(グローバル統計が正確)」となっています。これは増分統計収集の前提である、表のINCREMENTAL値を「TRUE」としたことで、各パーティションのシノプシス(列の統計メタデータ)がSYSAUX表領域に保存されるためです。
このように、時間と負荷の掛かる表全体のスキャンを行わなくても、各パーティションのシノプシスを集約することで、最小限の負荷で正確なグローバル統計を生成できます。そのため、パーティションが新しく追加された場合でも、追加したパーティションの統計を収集するだけでグローバル統計は最新の状態になります。
筆者紹介
大野高志
株式会社アシスト サービス事業部 サポートセンター所属。2007年にアシスト入社後、Oracle Databaseのサポート業務に従事。現在はサポート業務の傍ら、未解決のトラブルを1つでも多く減らせるよう、サポートセンターに蓄積されている調査のノウハウを社内外に伝える活動を行っている。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- パーティショニングは大規模DBの性能向上に効く
本連載では、大規模データベースでのパフォーマンス・チューニングの手法として、Oracleパーティショニングを解説する。単なる機能説明にとどまらず、実機による検証結果を加えて、より実践的な内容をお届けする。(編集部) - SQL分析関数をさらに深く追求してみよう
- パーティション・プルーニングの有効性を検証する
本連載では、大規模データベースでのパフォーマンス・チューニングの手法として、Oracleパーティショニングを解説する。単なる機能説明にとどまらず、実機による検証結果を加えて、より実践的な内容をお届けする。(編集部) - OracleとSQL Server、チューニングの違いを知る
本連載はOracleを使ったデータベースシステムの開発・運用管理にある程度の知識を持つ読者を対象に、Oracle以外の商用RDBMSであるMicrosoft SQL ServerとIBM DB2とのアーキテクチャの違いを明らかにし、マルチベンダに対応できるデータベースシステムの設計・開発・運用ノウハウを紹介していく。(編集局)