【Oracle Database】単一レベルパーティションで増分統計収集を行う方法 データベースサポート最前線の現場から(7)(1/2 ページ)

データベース管理システムの運用でトラブルが発生したらどうするか。データベースサポートスペシャリストが現場目線の解決Tipsをお届けします。今回は時間とリソースを抑えられる、「Oracle Databaseの単一レベルパーティションで増分統計集計を行う方法」を紹介します。

» 2017年02月03日 05時00分 公開
[大野高志株式会社アシスト]
※本連載は、アシストのデータベースサポートスペシャリストによる「Database Support Blog」より、提供社の許可の下、一部修正して転載するものです。

連載バックナンバー

 今回は、単一レベルパーティションで増分統計収集を行う方法を解説します。

 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 
INCREMENTAL値とPUBLISH値を確認

 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'); 
INCREMENTAL値とPUBLISH値を「TRUE」に設定する
       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。