【Oracle Database】単一レベルパーティションで増分統計収集を行う方法: データベースサポート最前線の現場から(7)(1/2 ページ)
データベース管理システムの運用でトラブルが発生したらどうするか。データベースサポートスペシャリストが現場目線の解決Tipsをお届けします。今回は時間とリソースを抑えられる、「Oracle Databaseの単一レベルパーティションで増分統計集計を行う方法」を紹介します。
今回は、単一レベルパーティションで増分統計収集を行う方法を解説します。
SQLを実行する際には、「コストベースオプティマイザ」(以下、CBO)が統計情報を基に実行計画を生成します。このCBOが最適な実行計画を選択するには、最新の統計情報を維持する必要があります。しかし、パーティション化を行うような大規模な表では、表全体をスキャンして統計情報を収集することも負荷の高い処理となります。
一般的にパーティション表を利用する場合、データは新しいパーティションに追加されます。Oracle Database 11g Release 1から、データが変更されたパーティションのみ統計情報を収集する「増分統計収集」と呼ばれる機能が追加されました。統計情報を収集するパーティションを限定することで、時間の短縮とリソースの消費を抑えられるようになっています。
増分統計収集を行うための条件
増分統計を収集するには、次の条件を満たす必要があります。
- パーティション表のINCREMENTAL値が「TRUE」である(デフォルトはFALSE)
- パーティション表のPUBLISH値が「TRUE」である(デフォルトはTRUE)
- DBMS_STATSパッケージを使用して統計情報を取得する際に、ESTIMATE_PERCENTに「AUTO_SAMPLE_SIZE」を指定する
- DBMS_STATSパッケージを使用して統計情報を取得する際に、GRANULARITYに「GLOBALが含まれる値」を指定する
INCREMENTAL値は、全表スキャンを実行することなく、パーティション表のグローバルな統計情報をメンテナンスできるかどうかの設定です。デフォルトではFALSE(無効)となっています。PUBLISH値は、収集された統計情報を即座にディクショナリに反映させる設定です。
なお、パーティションの機能を利用するには「Enterprise Edition」かつ「Partitioning」の追加ライセンスも必要です。
INCREMENTAL値とPUBLISH値の確認と変更方法
パーティション表のINCREMENTAL値とPUBLISH値は、「DBMS_STATS.GET_TABLE_PREFS」プロシージャを使って確認できます。
SQL> CREATE TABLE taono.part_tab 2 ( id NUMBER(6) 3 , date_p DATE 4 ) 5 PARTITION BY RANGE (date_p) 6 ( PARTITION date_p_2013 VALUES LESS THAN (TO_DATE('2014-01-01','YYYY-MM-DD')) 7 , PARTITION date_p_2014 VALUES LESS THAN (TO_DATE('2015-01-01','YYYY-MM-DD')) 8 , PARTITION date_p_2015 VALUES LESS THAN (TO_DATE('2016-01-01','YYYY-MM-DD')) 9 ); SQL> SELECT DBMS_STATS.GET_PREFS('INCREMENTAL', 'TAONO', 'PART_TAB') FROM dual; DBMS_STATS.GET_PREFS('INCREMENTAL','TAONO','PART_TAB') ------------------------------------------------------ FALSE SQL> SELECT DBMS_STATS.GET_PREFS('PUBLISH', 'TAONO', 'PART_TAB') FROM dual; DBMS_STATS.GET_PREFS('PUBLISH','TAONO','PART_TAB') ------------------------------------------------------ TRUE
PUBLISH値はTRUEでしたが、INCREMENTAL値はFALSEでした。設定の変更は「DBMS_STATS.SET_TABLE_PREFS」プロシージャで行います。
SQL> EXEC DBMS_STATS.SET_TABLE_PREFS('TAONO','PART_TAB','INCREMENTAL','TRUE'); SQL> EXEC DBMS_STATS.SET_TABLE_PREFS('TAONO','PART_TAB','PUBLISH','TRUE');
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- パーティショニングは大規模DBの性能向上に効く
本連載では、大規模データベースでのパフォーマンス・チューニングの手法として、Oracleパーティショニングを解説する。単なる機能説明にとどまらず、実機による検証結果を加えて、より実践的な内容をお届けする。(編集部) - SQL分析関数をさらに深く追求してみよう
- パーティション・プルーニングの有効性を検証する
本連載では、大規模データベースでのパフォーマンス・チューニングの手法として、Oracleパーティショニングを解説する。単なる機能説明にとどまらず、実機による検証結果を加えて、より実践的な内容をお届けする。(編集部) - OracleとSQL Server、チューニングの違いを知る
本連載はOracleを使ったデータベースシステムの開発・運用管理にある程度の知識を持つ読者を対象に、Oracle以外の商用RDBMSであるMicrosoft SQL ServerとIBM DB2とのアーキテクチャの違いを明らかにし、マルチベンダに対応できるデータベースシステムの設計・開発・運用ノウハウを紹介していく。(編集局)