【ORACLE】表や索引の統計情報を取得する方法


ここではORACLEデータベースで、表や索引の統計情報を取得する方法を紹介します。

表(テーブル)の統計情報の取得

テーブルの統計情報を取得するには、DBMS_STATSという既存のパッケージのGATHER_TABLE_STATSというプロシージャを起動します。

起動するときに、OWNNAMEにオーナー名(スキーマ名)、TABNAMEにテーブル名を指定します。

begin
 DBMS_STATS.GATHER_TABLE_STATS(
    OWNNAME =>'user1'
    ,TABNAME=>'table1'
 );
end;

パラレル実行する場合

テーブルのレコード件数が多くなればなるほど、統計情報を取得する時間は長くなります。

リソースに余裕があれば、統計情報の取得をORACLEのパラレル実行で簡単に速く、時間を短縮することが出来ます。

先ほどのオーナー名、テーブル名に加えて、パラレル実行数を引数にプロシージャーを実行します。次のサンプルでは、4多重で実行するように指示しています。

begin
 DBMS_STATS.GATHER_TABLE_STATS(
    OWNNAME =>'user1'
    ,TABNAME=>'table1'
    ,DEGREE =>4 --パラレル実行数
 );
end;

テーブルの統計情報の取得日を確認する方法

テーブルの統計情報が取得された日付は記録されており、SQLで簡単に取得できます。詳しくは「【SQL】ORACLE表の統計情報取得日を確認する方法」で解説しているのでぜひ参考にしてください。

索引(インデックス)の統計情報の取得

索引(インデックス)の統計情報を取得するには、DBMS_STATSパッケージのGATHER_INDEX_STATSというプロシージャを起動します。

起動するときに、OWNNAMEにオーナー名(スキーマ名)、INDNAMEに索引名を指定します。

begin
 DBMS_STATS.GATHER_INDEX_STATS(
    OWNNAME =>'user1'
    ,INDNAME=>'table1'
 );
end;

パラレル実行する場合

パラレル実行する場合は、DEGREEにパラレル実行する多重度を記述します。

begin
 DBMS_STATS.GATHER_INDEX_STATS(
    OWNNAME =>'user1'
    ,INDNAME=>'table1'
    ,DEGREE =>4 --パラレル実行数
 );
end;

内部オブジェクトの統計情報取得

ORACLEが内部的に所有しているオブジェクトの統計情報も定期的に取得する必要があります。

こちらは自動的に取得されないので、たまに取得する必要があります。

内部オブジェクトの取得にはDBMS_STATSパッケージを使います。

begin
    DBMS_STATS.GATHER_FIXED_OBJECTS_STATS(
     no_invalidate=>DBMS_STATS.AUTO_INVALIDATE
    )
end;

最後に

最後までお読みいただきありがとうございます。

当サイトではSQLのチューニングについても紹介しています。
詳しくは「SELECT文のSQLチューニング方法まとめ」で解説していますので、ぜひ参考にしてください。