データベース管理システムの運用でトラブルが発生したらどうするか。データベースサポートスペシャリストが現場目線の解決Tipsをお届けします。今回は時間とリソースを抑えられる、「Oracle Databaseの単一レベルパーティションで増分統計集計を行う方法」を紹介します。
今回は、単一レベルパーティションで増分統計収集を行う方法を解説します。
SQLを実行する際には、「コストベースオプティマイザ」(以下、CBO)が統計情報を基に実行計画を生成します。このCBOが最適な実行計画を選択するには、最新の統計情報を維持する必要があります。しかし、パーティション化を行うような大規模な表では、表全体をスキャンして統計情報を収集することも負荷の高い処理となります。
一般的にパーティション表を利用する場合、データは新しいパーティションに追加されます。Oracle Database 11g Release 1から、データが変更されたパーティションのみ統計情報を収集する「増分統計収集」と呼ばれる機能が追加されました。統計情報を収集するパーティションを限定することで、時間の短縮とリソースの消費を抑えられるようになっています。
増分統計を収集するには、次の条件を満たす必要があります。
INCREMENTAL値は、全表スキャンを実行することなく、パーティション表のグローバルな統計情報をメンテナンスできるかどうかの設定です。デフォルトではFALSE(無効)となっています。PUBLISH値は、収集された統計情報を即座にディクショナリに反映させる設定です。
なお、パーティションの機能を利用するには「Enterprise Edition」かつ「Partitioning」の追加ライセンスも必要です。
パーティション表の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.