~初心者が最初にやるべき5ステップとAWR・Statspackの使い分け~
Oracleデータベースで「処理が遅い」「応答が返ってこない」といったトラブルに直面したとき、頼りになるのがパフォーマンスチューニングです。
ただし「何を、どこから見ればいいのか分からない…」と感じる初心者の方も多いはず。
そこで本記事では、Oracleパフォーマンスチューニングの基礎知識から、実践で使える5つの手順、AWRとStatspackの選び方までを、テキスト図解付きでわかりやすく解説します。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
■ パフォーマンスチューニングとは?
Oracleにおけるパフォーマンスチューニングとは、
システムやSQLの処理速度を改善するための「現状分析」「原因特定」「改善」の一連のプロセスです。
■ 3層構造で考えるチューニング
【Oracleパフォーマンスチューニングの3層構造】
+----------------------------+
| アプリケーション層 | SQL, PL/SQL, Javaなど
+----------------------------+
| データベース層 | 統計情報, 実行計画, インデックス
+----------------------------+
| OS・インフラ・I/O層 | メモリ, CPU, ディスクI/O
+----------------------------+
初心者の方はまず「アプリケーション層(SQL)」と「データベース層」のチューニングから始めると効果が出やすく、リスクも低く抑えられます。
■ 【図解】パフォーマンスチューニングの流れ(5ステップ)
① 症状を把握する
↓
② ボトルネックを特定する
↓
③ 原因を分析する
↓
④ 対策を実施する
↓
⑤ 効果を検証する
■ Step①:症状の把握 ~どの処理が遅いのか~
まず重要なのは、「どの処理がどれくらい遅いのか」を定量的に把握することです。
● 主な調査手段(初心者向け)
| ツール名 | 説明 | 対応エディション |
|---|---|---|
| AWR(Automatic Workload Repository) | データベース全体の統計情報を時系列で分析できる有償ツール | Enterprise Edition(+Diagnostic Pack) |
| Statspack | AWRの無償簡易版で、Standard Edition でも使用可 | Standard Edition 〇 / Enterprise Edition 〇 |
| V$ビュー群 | 現在のSQL・セッション情報をリアルタイムに取得 | 全エディション可 |
🔍 AWRとStatspackの違い(比較表)
| 比較項目 | AWR | Statspack |
|---|---|---|
| エディション | Enterprise Edition(+ライセンス) | Standard Edition対応 |
| データ保存 | 自動・継続的 | 手動でスナップショット取得 |
| 分析対象 | より詳細・包括的 | 基本的な指標中心 |
| 出力形式 | HTML, Text, EM画面等 | Textのみ(スクリプト出力) |
Standard Edition環境ではStatspack一択、Enterprise EditionではAWR推奨というのが基本スタンスです。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
■ Step②:ボトルネックの特定
Oracleのパフォーマンス問題のボトルネックは、大きく次の4つに分類されます。
【ボトルネックの種類】
- SQLの実行が遅い(実行計画・インデックス)
- ディスクI/Oが遅い(物理読み込みが多い)
- CPU負荷が高い(ソート・関数処理など)
- ロック競合が多い(TM/TX待機イベント)
● よく使うV$ビュー例(SQL単位の調査)
-- 実行時間が長いSQLのトップ10を取得
SELECT sql_id, elapsed_time, executions, sql_text
FROM v$sql
ORDER BY elapsed_time DESC FETCH FIRST 10 ROWS ONLY;
■ Step③:原因の分析 〜SQL実行計画の読み方〜
SQLの実行時間が長い原因の多くは、「実行計画の非効率さ」にあります。
● 実行計画の取得方法(基本)
EXPLAIN PLAN FOR
SELECT * FROM employees WHERE department_id = 10;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
● 実行計画で注目すべきポイント
| 項目 | 説明 | チェックすべき点 |
|---|---|---|
| FULL TABLE SCAN | 全件走査 | インデックスが効いていない? |
| INDEX RANGE SCAN | 範囲検索 | 使えるインデックスがあるか? |
| NESTED LOOPS | ループ結合 | 小規模データ向け、INDEX必要 |
| HASH JOIN | 大規模結合向け | 統計情報が必要 |
■ Step④:改善の実施
原因が判明したら、改善施策を行います。
✅ インデックスの作成(WHERE条件に合わせる)
CREATE INDEX idx_emp_dept ON employees (department_id);
✅ 統計情報の収集(古いと誤った実行計画に)
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'EMPLOYEES');
✅ SQLの見直し(典型的な改善パターン)
SELECT *→ 必要な列だけに絞る- サブクエリの冗長なネストを削減
- ヒント句で実行計画を誘導する(必要に応じて)
■ Step⑤:効果検証 ~チューニングは「やって終わり」ではない~
改善後は、定量的に効果を検証することが必須です。
● SQLトレースの活用例
ALTER SESSION SET SQL_TRACE = TRUE;
-- 対象SQLを実行
ALTER SESSION SET SQL_TRACE = FALSE;
取得した.trcファイルをtkprofで解析:
tkprof ora_12345.trc output.txt sort=elapsed
■ テスト用テーブル(サンプル)
CREATE TABLE employees (
employee_id NUMBER PRIMARY KEY,
first_name VARCHAR2(50),
last_name VARCHAR2(50),
department_id NUMBER,
salary NUMBER
);
INSERT INTO employees VALUES (1, 'Taro', 'Yamada', 10, 500000);
INSERT INTO employees VALUES (2, 'Hanako', 'Suzuki', 20, 550000);
INSERT INTO employees VALUES (3, 'Jiro', 'Tanaka', 10, 480000);
INSERT INTO employees VALUES (4, 'Akira', 'Sato', 30, 620000);
■ まとめ:初心者が守るべき5つの原則
1. いきなり修正せず、まず「現状把握」から
2. SQLチューニングは最も効果的
3. 実行計画と統計情報は常にチェック
4. AWR/Statspackを正しく使い分ける
5. 改善後は数値で“見える化”する




コメント