Oracleの統計情報の収集はデフォルトでは自動で行われますが、
以下のプロシージャを実行することによって手動で統計情報を更新することができます。
デフォルトでは1日1回しか更新されないので、大量データを投入後などにすぐにSQL文を実行しても、 インデックスがうまく使われなかったり、逆に全表走査の方が早い場合でもインデックスが使われてしまったりします。
そういった場合には手動で統計情報を更新する必要があります。
統計情報がいつ収集されたかは、以下のSQL文で確認することができます。
LAST_ANALYZEDが統計情報が収集された日付です。
ちなみに、前回の収集時点からテーブルのデータが10%以上更新されないと、統計情報は再収集されないようです。
デフォルトでは統計情報は自動で収集されると書きましたが、
初期化パラメータ「STATISTICS_LEVEL」が「TYPICAL」または「ALL」の場合に、自動で統計情報が収集されます。
以下のコマンドでパラメータの確認が出来ます。
以下のSQLでもパラメータの確認ができます。
以下のプロシージャを実行することによって手動で統計情報を更新することができます。
BEGIN --テーブル単位の収集 DBMS_STATS.GATHER_TABLE_STATS ( OWNNAME => 'ユーザ名' ,TABNAME => 'テーブル名' ,METHOD_OPT => 'FOR ALL INDEXED' ,CASCADE => TRUE ); END; BEGIN --スキーマ単位の収集 DBMS_STATS.GATHER_SCHEMA_STATS ( OWNNAME => 'ユーザ名' ,OPTIONS => 'GATHER' ); END;
デフォルトでは1日1回しか更新されないので、大量データを投入後などにすぐにSQL文を実行しても、 インデックスがうまく使われなかったり、逆に全表走査の方が早い場合でもインデックスが使われてしまったりします。
そういった場合には手動で統計情報を更新する必要があります。
統計情報がいつ収集されたかは、以下のSQL文で確認することができます。
SELECT TABLE_NAME NAME , LAST_ANALYZED FROM USER_TABLES WHERE TABLE_NAME = 'テーブル名' UNION ALL SELECT INDEX_NAME , LAST_ANALYZED FROM USER_INDEXES WHERE INDEX_NAME = 'インデックス名'
LAST_ANALYZEDが統計情報が収集された日付です。
ちなみに、前回の収集時点からテーブルのデータが10%以上更新されないと、統計情報は再収集されないようです。
デフォルトでは統計情報は自動で収集されると書きましたが、
初期化パラメータ「STATISTICS_LEVEL」が「TYPICAL」または「ALL」の場合に、自動で統計情報が収集されます。
以下のコマンドでパラメータの確認が出来ます。
SHOW PARAMETERS STATISTICS_LEVEL
以下のSQLでもパラメータの確認ができます。
SELECT NAME , VALUE FROM V$PARAMETER WHERE NAME = 'statistics_level'