ISBN 9784774173016
SQL実践入門──高速でわかりやすいクエリの書き方
概要
実行計画を読み解いて高速・保守しやすいSQLを書く実践書
想定読者
SQLを日常業務で書くバックエンドエンジニア・DBAで、クエリが遅い・読みづらいという実務課題に直面している中級者
こんな人には向いていない
- SELECT/JOIN/GROUP BYを習得中の段階にある初学者には、実行計画の読み方が前提として要求される箇所で躓きやすい
- BigQuery・Snowflakeなど列指向DWH専用の環境で働き、RDBMSの実行計画最適化と縁遠い場合は本書の適用範囲が限られる
- すでに本番DBのチューニング業務を担うDBAには、実行計画の基礎説明に割かれるページ比率が物足りない可能性がある
この本で身につくこと
- EXPLAIN(実行計画)を読み解き、クエリがどのインデックスや結合アルゴリズムで処理されているかを把握できる
- インデックスが無効化される検索条件のパターン(型変換・関数適用・LIKE前方一致外れ等)を識別・回避できる
- CASE式を使った条件分岐でUPDATE複数回発行を1クエリに整理し、I/Oコストを削減できる
- UNION・サブクエリ・結合の書き方がパフォーマンスに与える差異を理解し、場面ごとに最適解を選べる
- 集約やループ処理をSQLの集合思考で書き直し、アプリ側のN+1的な繰り返し処理を構造から解消できる
ハイライト(外部からの言及)
データベース内部でどう処理が実行されているかを示す実行計画を読み解くことで、「なぜそう書くと効率が良いのか」「可読性や保守性が向上するのか」を実感を持って理解することを目指します — 出典
良し悪しの暗記ではなく実行計画からの納得を学習目標に据える点が本書の独自性として端的に表れている
WHEREやHAVINGで条件分岐させたSELECT句を複数用意してUNIONでつなげるのは、つなげた分テーブルアクセスが増えて性能劣化につながる。CASE式で、条件を分岐させて、テーブルアクセス回数を減らすべし。 — 出典
本書の読後メモとして書かれた記事から。UNION多発というよくある実装パターンをCASE式一本に置き換える設計発想を端的に示しており、抽象的な「高速化」ではなくテーブルアクセス回数という具体軸で本書の提案を伝える
ある時点では最適な実行計画が選ばれSQLのパフォーマンスも問題なかったが、データの登録・更新・削除が頻繁に行われるにつれてSQLのパフォーマンスが劣化していく、といったケースがよくあります — 出典
本書を参考文献に挙げる実務者記事から。統計情報の陳腐化による性能劣化という現場頻出の落とし穴を示しており、実行計画を継続的に読む必要がある理由を読者に具体化する異なる角度の補強
読了後にできること
Before(読む前): 実行計画や統計情報の意味がわからず、クエリが遅い原因を特定できないままアプリ側で回避策を積み重ねていた
After(読み終えた後): EXPLAIN出力を読んでボトルネックの箇所と原因を特定し、インデックス設計やクエリ書き換えで自力改善できる
章立て
第1章 DBMSのアーキテクチャ──この世にただ飯はあるか
ストレージ・クエリエンジンの基本。後続章を理解する前提知識
第2章 SQLの基礎──母国語を話すがごとく
標準 SQL の文法と SELECT の動作モデル
第3章 SQLにおける条件分岐──文から式へ
CASE 式の活用。手続き型から宣言型への思考転換
第4章 集約とカット──集合の世界
GROUP BY の内部動作(ハッシュ/ソート選択と TEMP 落ちのリスク)と CASE を使った集約キー分岐を扱う。複雑な集計クエリのコスト感覚を掴むうえで実務頻出の内容。
第5章 ループ──手続き型の呪縛
再帰 CTE による反復処理。ループを SQL でどう表現するかを学ぶ
第6章 結合──結合を制する者はSQLを制す
本書の核心の 1 つ。Nested Loop / Hash / Sort Merge Join のアルゴリズム視点
第7章 サブクエリ──困難は分割するべきか
相関サブクエリのパフォーマンス特性と JOIN への書き換え判断
第8章 SQLにおける順序──甦る手続き型
Window 関数。時系列データ処理で最頻使用
第9章 更新とデータモデル──盲目のスーパーソルジャー
INSERT/UPDATE の書き込み性能とテーブル設計との依存関係を扱う。複数回 UPDATE を CASE 式や MERGE でまとめる手法は I/O 削減効果が高く、バッチ処理の見直し時に参照価値がある。
第10章 インデックスを使いこなす──秀才の弱点
B-Tree / Hash インデックスの動作特性と落とし穴。本書の集大成的章
関連記事 / 参考情報
- 1年半のソフトウェアエンジニア長期インターンで出会ったオススメ本をたくさん紹介します — インターン経験者が業務で役立った技術書を紹介、本書をSQL力強化の一冊として推薦
- 実行計画??統計情報??って人へ — 実行計画と統計情報の概念を丁寧に解説し、本書を理解の足場として紹介
- インデックスが使えない検索条件 — 本書のインデックス活用テーマを実践した記事、どの条件でインデックスが効かないかを具体例で解説
- 開発への異常な愛情 または私は如何にして嫉妬を止めてActive Recordを愛するようになったか — ORMとSQLの関係を掘り下げた記事、素のSQLを理解することの重要性を実体験から議論
- 高速でわかりやすいクエリ — 本書のタイトルと同主題で書かれた実践メモ、書籍内容を業務で応用した事例
- 書評:Effective SQL — Effective SQLのレビュー記事、本書と対比させながらSQL設計書の選び方を整理
- SQLのパフォーマンスに直結するselectivity(選択度)について理解を深める — インデックス設計の根幹となる選択度の概念を解説、本書のパフォーマンス議論の補足として有用
- SQL INDEXつきテーブルを結合する際の駆動表は小さく! — 本書の結合最適化テーマを実務で検証した記事、駆動表の選択が速度差を生む実測例を示す
学習のヒント
- 実行計画の読み方を扱う序盤の章を先に通読してから各クエリパターン(条件分岐・集約・結合)の章に戻ると、「なぜその書き方が速いか」の根拠が繋がり理解の回収速度が上がる
- 良い例・悪い例のコードは手元のMySQL/PostgreSQLでEXPLAINを実際に叩きながら読むと、数値の変化として実感でき定着が早い
- 「条件分岐」と「集約」の章は出現頻度が高い実務テーマなので早期に読む価値がある。「ループ」章はアプリ側の実装方針を変えるきっかけになるため、既存コードの見直しを意識している時期に読むと吸収率が上がる
- 2015年刊行のため一部のSQL方言や構文例は古いが、実行計画の原理とインデックス活用の考え方はRDBMSのバージョンを越えて有効
前提知識
- SELECT・WHERE・GROUP BY・JOINを実務クエリで使えるSQL基礎力
- MySQL・PostgreSQL・Oracleいずれかで実際にクエリを実行・動作確認した経験
- アプリケーションからDBを呼び出す基本的な開発経験(N+1問題などの実感があるとより効果的)
次に読む本
SQLアンチパターン
本書がクエリの書き方と実行計画の読み方を中心に扱うのに対し、『SQLアンチパターン』はテーブル設計段階の失敗パターン(ジェイウォーク・EAV等)を体系化している。クエリ最適化で解決できない根本的な設計問題に直面したタイミングで本書の次に読むと、SQL改善の視点が構造レベルまで広がる。
プログラマのためのSQLグラフ原論
『SQL実践入門』が集合・条件分岐・結合の実行効率を扱うのに対し、本書は木構造・グラフ・経路探索のSQL表現という上級テーマを集合論ベースで展開する。集約やループの章で集合思考に手応えを感じた読者が、同著者の応用編としてその思考をより複雑なデータ構造へ展開する段階に最適。
データベース・パフォーマンスアップの教科書
『SQL実践入門』が実行計画とクエリの書き方を主眼に置くのに対し、本書はストレージI/O・バッファ・ロック・接続管理といったDB全体のチューニング方法論をDBA視点で体系化している。クエリ改善の限界を感じてインフラや設定チューニングまで踏み込みたい段階で読む一冊。
出版社による内容紹介
SQLはデータベース操作に特化した言語で、柔軟にデータを操作できます。ただし、独自のロジックに基づいているため、それを正しく理解しなければ、読みづらくパフォーマンスの出ないSQLになってしまいます。本書では、「条件分岐」「集約」「ループ」「結合」「更新」など日常的に実行する処理の良い書き方・悪い書き方を解説します。その際、データベース内部でどう処理が実行されているかを示す実行計画を読み解くことで、「なぜそう書くと効率が良いのか」「可読性や保守性が向上するのか」を実感を持って理解することを目指します。
この本がどの学習段階で役立つかは、 関連する ロードマップ から確認できます。