SQL クエリの実行プランを分析する
EXPLAIN は、データベースがクエリをどのように実行するかを示します。プランの読み方を学び、ボトルネックを特定して最適化しましょう。
- 1
EXPLAIN(PostgreSQL では EXPLAIN ANALYZE、MySQL では EXPLAIN WITH STATISTICS)は実行プランを表示します:スキャン方式(シーケンシャル、インデックス、ビットマップ)、結合方式(ネステッドループ、ハッシュ、マージ)、ソート方式、推定コストと行数。注目すべきは、大きなテーブルでのシーケンシャルスキャン、高コストなソート、大きな入力に対するネステッドループ結合、不正確な行数推定です。
- 2 SQL フォーマッター →
EXPLAIN を実行する前にクエリをフォーマットしましょう。読みやすいクエリは、実行プランを SQL に対応付ける作業を楽にします。また、フォーマットにより、クエリのどの部分がプラン内の高コスト操作の原因になっているかを特定しやすくなります。
- 3 sql-format → word-count
SQL フォーマットのワークフローを使ってクエリをフォーマット・ドキュメント化してから、フォーマット済みのバージョンに EXPLAIN を実行します。実行プランと対応付けやすい、整ったクエリが得られます。
よくある質問
- EXPLAIN と EXPLAIN ANALYZE の違いは?
- EXPLAIN は統計に基づく推定プランを表示します。EXPLAIN ANALYZE は実際にクエリを実行し、実際の行数、所要時間、メモリ使用量を表示します。手早い確認には EXPLAIN を、正確な診断には EXPLAIN ANALYZE を使いましょう。注意:ANALYZE はクエリを実行します。INSERT/UPDATE/DELETE に対しては、ROLLBACK 付きのトランザクションを使いましょう。
- シーケンシャルスキャンとは何で、いつ問題になるの?
- シーケンシャルスキャンはテーブルのすべての行を読み取ります。小さなテーブルや、ほとんどの行が一致する場合は問題ありません(インデックス参照 + 取得より速いため)。一致する行が少ない大きなテーブルでは遅くなるため、インデックスを追加しましょう。EXPLAIN の出力に「Seq Scan」と表示されたら、推定行数がテーブルの大部分を占めていないか確認してください。
このタスクを解決するワークフロー
SQL フォーマットと単語統計によるドキュメント化
SQL クエリを整形し、その後フォーマットされた出力を単語統計で分析する。 パイプライン
Lorem Ipsum 生成と単語カウント
Lorem Ipsum テキストを生成し、その後単語をカウントする。 パイプライン
SQL フォーマットと構文検証
SQL クエリをフォーマットし、その後構文を検証する。 パイプライン
テキストのクリーンアップ後の単語統計分析
テキストをトリムして正規化し、その後単語/文字/行統計を計算する。 パイプライン
行の重複除去と単語カウント
行をソートして重複を除去し、その後残りの単語をカウントして簡単な在庫を得る。 パイプライン
テキストの小文字化と単語カウント
テキストのケースを正規化し、その後分析のために単語をカウントする。 パイプライン
URL 除去と単語カウント
テキストから URL を除去し、その後残りの単語をカウントする。 パイプライン
Title Case と単語カウント
Title Case に変換し、その後単語をカウントする。 パイプライン
テキストの折り返しと単語カウント
長いテキストを折り返し、その後結果の単語をカウントする。 パイプライン
関連ツール
SQL フォーマッター
Beautify or minify SQL queries online. Uppercase keywords, indent clauses, or compress to a single line。無料、プライベート、100%クライアントサイド。 ツール
JSON バリデーター
Validate JSON and pinpoint syntax errors by line and column。無料、プライベート、100%クライアントサイド。 ツール
正規表現テスター
Test regular expressions with match highlighting, capture groups, and replace preview。無料、プライベート、100%クライアントサイド。 ツール