Oracle統計情報について

Published by

on

項目バージョン
Oracle19c(19.3.0)
OSWindowsServer2025

■実行計画とは

SQLを記述して実行する際、テーブルの結合情報やWHERE句に抽出の条件の記載はしますが、どのような順序でテーブルを結合したりするか、といった指定はしません。OracleはSQLを実行する際、あらかじめ収集しているテーブル、インデックス情報やシステムの情報(CPU、メモリ等のリソース)を基にした「実行計画」により処理手順を決定しています。

この実行計画は「最も効率よく処理できる方法」をOracle自身が導き出すものです。

■オプティマイザ統計とは

実行計画を立てる中で必要となる「Oracleがあらかじめ収集する情報」がオプティマイザ統計情報です。このオプティマイザ情報をいつどのように収集するか、という話ですが基本はOracleのデフォルトの設定にお任せするのが良いようです。どうしても個別のニーズや必要がある場合は手動で行うこともできるようです。

■オプティマイザ統計の情報収集タイミングについて

Oracleであらかじめ設定されている「メンテナンス時間枠」において収集が必要と判断されたとき、収集が実行されます。基本は「平日の午後10時~午前2時、週末の午前6時~午前2時」ということのようですが、変更はできるようです。

■統計情報の取得状況確認

統計情報の取得状況は以下のSQLで確認ができます。

SELECT * FROM DBA_TAB_STATS_HISTORY WHERE OWNER = 'XXX' ORDER BY STATS_UPDATE_TIME DESC;

次のSQLでは現状の統計情報を確認し、更新すべきか確認ができます。「LAST_ANALYZED」は最後に分析(収集)された日時を示し、「STALE_STATS」は情報の状態を示します。(「STALE」=「古い」)

  • NO:統計情報が有効(情報が古くない)
  • YES:統計情報が古い
  • NULL:統計情報が取得されていない
SELECT OWNER, TABLE_NAME, STALE_STATS, LAST_ANALYZED, OBJECT_TYPE, NUM_ROWS FROM DBA_TAB_STATISTICS WHERE OWNER = 'XXX';

■統計情報の手動収集

特殊な要件があれば別ですが最初に記載しましたように基本はOracleに任せて自動収集でよいと思います。しかし大量のデータを投入した場合など、自動での収集を待たずに処理するほうが望ましいケースもあります。

手動で収集するには「DBMS_STATS」パッケージ内の「GATHER_XXXX_STATS」プロシージャを利用します。(「XXXX」部分はスキーマ単位、テーブル単位など以下のような選択肢があります。

プロシージャ名オプティマイザ収集対象
GATHER_DATABASE_STATSデータベース内のすべてのオブジェクト
GATHER_SCHEMA_STATS指定したスキーマ
GATHER_TABLE_STATS指定したテーブル、列情報、インデックス
GATHER_INDEX_STATS指定したインデックス
GATHER_SYSTEM_STATSマシンのCPUやI/O速度など
EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS('TS_APP01');

(参考)Oracle Database 19cにおけるオプティマイザ統計収集のベスト・プラクティス

(参考)データベースリファレンス:ALL_TAB_STATISTICS、DBA_TAB_STATISTICS、USER_TAB_STATISTICS

(改版履歴)2025/08/27, 2025/06/21

コメントを残す