連載
» 2017年02月03日 05時00分 公開

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

[大野高志,株式会社アシスト]
前のページへ 1|2       

増分統計収集の実行

 まず、表全体の統計情報を収集しておきます。

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
 
DATE_P_2015パーティションにデータを投入

 これで準備が済みました。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表領域に保存されるためです。

 このように、時間と負荷の掛かる表全体のスキャンを行わなくても、各パーティションのシノプシスを集約することで、最小限の負荷で正確なグローバル統計を生成できます。そのため、パーティションが新しく追加された場合でも、追加したパーティションの統計を収集するだけでグローバル統計は最新の状態になります。

※初出:2015年11月2日 Database Support Blog「単一レベル・パーティション表で増分統計収集を行う方法

筆者紹介

大野高志

株式会社アシスト サービス事業部 サポートセンター所属。2007年にアシスト入社後、Oracle Databaseのサポート業務に従事。現在はサポート業務の傍ら、未解決のトラブルを1つでも多く減らせるよう、サポートセンターに蓄積されている調査のノウハウを社内外に伝える活動を行っている。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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