統計情報とは
統計情報とはテーブルやインデックス、レコード件数などの情報のことです。これらの情報が記録されたものを統計情報と呼びます。
統計情報が古いと何が悪い?
統計情報が古いと言うのは、最新のデータの状態と統計情報の状態が一致していないことを言います。 この状態を統計情報が古いと言います。
なぜ、古いと悪いのかというと。
SQLの実行は、この統計情報の内容をもとにして最適な実行計画を作って実行されます。
統計情報が古いと最適な実行計画が作られない場合があり、パフォーマンスが悪くなくなっていきます。
統計情報はどうやって最新になるの?
Oracleが自動取得する場合
自動取得に設定されている場合、深夜に1度取得されます。
この時、すべてのテーブルやインデックスが対象とはなりません。テーブルやインデックスの更新されたデータの割合が高いものだけが統計情報を取得されます。
手動で取得する場合
手動で統計情報を取得する場合はバッチ処理が起動されたタイミングで取得されます。
統計情報の取得された日付や取得方法
こちらでは、統計情報の取得された日付の確認方法と統計情報の取得方法を解説します。
統計情報の取得対象は3つありますので、それぞれ解説します。
- 表(テーブル)
- 索引(インデックス)
- 内部オブジェクト
統計情報の取得された日付の確認方法
統計情報が最後に取得された日付は、テーブルごとに情報が残っています。
以下のSQLで確認できます。
SELECT
AT.TABLE_NAME – テーブル名
,AT.NUM_ROWS – 件数
,AT.LAST_ANALYZED – 統計情報を最後に取得した日付
FROM
ALL_TABLES AT
WHERE
AT.OWNER = ‘’ – オーナー名
AND
AT.TABLE_NAME = ‘’ – テーブル名
統計情報の取得方法(表(テーブル))
テーブルの統計情報を取得するには、DBMS_STATSパッケージのGATHER _TABLE_STATSプロシージャを使います。
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(
OWNNAME => ‘ここにオーナー名を入力’
,TABNAME => ‘ここにテーブル名を入力’
);
END;
パラレル実行する方法
テーブルのレコード件数が多くなれば、統計情報を最新にする時間は長くなります。リソースに余裕があれば、Oracleのパラレル実行で時短することができます。
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(
OWNNAME => ‘ここにオーナー名を入力’
,TABNAME => ‘ここにテーブル名を入力’
,DEGREE => 4 –パラレル実行数
);
END;
統計情報の取得方法(索引(インデックス))
インデックスの統計情報を取得するには、DBMS_STATSパッケージのGATHER _INDEX_STATSプロシージャを使います。
BEGIN
DBMS_STATS.GATHER_INDEX_STATS(
OWNNAME => ‘ここにオーナー名を入力’
,INDNAME => ‘ここにインデックス名を入力’
);
END;
パラレル実行する方法
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(
OWNNAME => ‘ここにオーナー名を入力’
,INDNAME => ‘ここにインデックス名を入力’
,DEGREE => 4 –パラレル実行数
);
END;
統計情報の取得方法(内部オブジェクト)
Oracleが内部で所有しているオブジェクトの統計情報を定期的に取得する必要があります。
BEGIN
DBMS_STATS.GATHER_FIXED_OBJECTS_STATS(
no_invalidate => DBMS_STATS.AUTO_INVALIDATE
);
END;
まとめ
統計情報を定期的に最新化しておくことで、パフォーマンス向上につながりますので自動化しておくことをオススメします。
コメント