SQL パフォーマンス: EXPLAIN で実行計画を読み、インデックスで検索を速くする

30 万行のイベント ログに対して、EXPLAIN ANALYZE で「なぜ遅いか」を実行計画から読み取り、単一列インデックスと複合インデックスを作って Seq Scan を Index Scan に変えます。インデックスのサイズと更新コストのトレードオフも確認する、DB 運用の基本スキルです。

中級約 45 分Azure 実環境

ラボ概要

このラボでは、「ユーザーの行動履歴を出す画面が遅い」と言われたアプリ担当の想定で、PostgreSQL の実行計画を読み、インデックスで検索を速くします。

ブラウザで開く IDE の中の PostgreSQL に、イベント ログ events(30 万行、インデックスは主キーのみ)が入っています。まず EXPLAIN ANALYZE で全件走査(Seq Scan)になっていることと実際の時間を確認し、user_id のインデックス、続いて event_type と created_at の複合インデックスを作って、実行計画と時間がどう変わるかを実測します。

学習目標:

  • EXPLAIN / EXPLAIN ANALYZE の出力(Seq Scan・Index Scan・Bitmap Heap Scan・cost・actual time・rows)を読む
  • CREATE INDEX で単一列インデックスを作り、効果を実行計画で確認する
  • 複数条件の検索に効く複合インデックスの列順を考える
  • インデックスのサイズ(pg_relation_size)と、書き込みコストとのトレードオフを理解する
前提知識:
  • SELECT / WHERE の基本
完了条件:
  • explain_before.txt に Seq Scan の実行計画、explain_after.txt に Index Scan(または Bitmap)の実行計画が保存されていること
  • idx_events_user_id と idx_events_type_created (event_type, created_at) が作成され、対応する検索がそれぞれのインデックスを使うこと

ラボの構成

  1. 1ブラウザ IDE を開いてテーブルを確認する
  2. 2遅い検索の実行計画を読む
  3. 3user_id にインデックスを作る
  4. 4複数条件の検索に複合インデックスを作る
  5. 5インデックスのコストを確認する
  6. 6判定を実行する
  7. 7発展(任意)と考察

詳細な手順は、ラボ開始後に画面内のガイドとして表示されます。

手順のプレビュー(最初のステップ)

1. ブラウザ IDE を開いてテーブルを確認する

  • ラボ画面の ブラウザ IDE を開く をクリックし、表示されているパスワードでサインインする
  • README.md を読み、Terminal → New Terminal でターミナルを開いて PostgreSQL に接続する
psql "$DATABASE_URL"
\d events
SELECT count(*) FROM events;                           -- 300000
SELECT event_type, count(*) FROM events GROUP BY 1;    -- 5 種類 × 6 万行
\di events*                                           -- 主キーのインデックスだけ

> 注: \d はテーブル定義、\di はインデックス一覧を出す psql のメタコマンドです。

残り 6 セクションの手順は、ラボを開始すると画面内に表示されます

構成図

構成図

参考リソース

このラボが対応する試験の模擬問題集

本番形式の問題で理解度を確認できます。各試験とも先頭 15 問は無料です。

DP-300Azure Database Administrator練習テスト 2 回・全 160 問