| 項目 | バージョン |
|---|---|
| Oracle | 19c(19.3.0) |
| OS | WindowsServer2025 |
■実行計画とは
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
コメントを残す