2015/04/29

「SQL実践入門」がとてもわかりやすい

最近出た「SQL実践入門」を読んでいます。「達人に学ぶ〜」シリーズで有名なミックさんの新著で主にSQLのパフォーマンスについての話をメインとした本。
相変わらず説明がとてもわかりやすく非常によい本だったので紹介。

SQLとパフォーマンスについての話がメイン

個人的にDB関連の書籍の分類は大きく以下の3種類に分類して考えているのですが、本書については一番上のカテゴリにはいりそうです。(「プログラマのためのSQL」も一番上かな・・・)
  • SQL、パフォーマンス(実行計画)
    • 本著
    • 達人に学ぶSQL徹底指南書
    • SQLパズル(積んでる・・・)など
  • テーブル設計
    • 達人に学ぶDB設計徹底指南書
    • 理論から学ぶデータベース実践入門など
  • DBMS製品個別の話(DB運用含む)
    • 内部構造から学ぶPostgreSQL
    • SQL Server 2008 ビギナーズガイド
    • エキスパートのためのMySQLトラブルシューティングガイド(読んでない・・・)など
SQLの基本となる考え方、テクニック、実行計画の読み解き方といった所から、DBを使用する際のボトルネックをどのように解消していけばいいのかという話がメインになっています。

ミックさんといえば「達人に学ぶSQL徹底指南書」「達人に学ぶDB設計徹底指南書」が有名。両著は非常にわかりやすく、DB関連の入門書としてかなりオススメの2冊です。
本書は「達人に学ぶSQL徹底指南書」より一歩踏み込んだ内容になっており、恐らくそちらを読んでからの方が深く理解できそうです。

主にPostgreSQLとOracleの実行計画を確認しながら、話を進めていくような形になっているので、少なくとも実行計画とはなんぞや?くらいの知識があるとよさそうです。
なお、実行計画の読み方は本書内で説明されているのでなんとかなるかと。

SQL実行時に使用されるアルゴリズムがわかる

この辺りちゃんと理解していないとオプティマイザーの気持ちがわからなくて、有効なインデックスの付け方や実行計画の操作が上手くできないのですよね。。。

SQL実行時に使用されるアルゴリズム(実行計画で見ることができる)にはそれぞれの操作毎に複数のアルゴリズムが存在します。
  • 例)Join
    • Nested Loop Join
    • Hash Join
    • Merge Join
自分はDB関連の知識としては主にMySQLあたりから入ったので、MySQLでサポートされていないアルゴリズム(例えばJoinはMySQLは5.5まではNested Loop Joinしかサポートされていなかった)について説明されているのがとてもありがたい感じでした。

あと、「達人に学ぶ〜」よりもウィンドウ関数に関してさらに複雑な使い方が紹介されていたりします。
衝撃的だったのは本著で「ぐるぐる系」と呼ばれているカーソルを回して処理をする系のロジック(性能問題になりやすい)をウィンドウ関数で書き換える話の中で、現在のレコードとひとつ前のレコードを比較して何かを判定するみたいな処理をウィンドウ関数で書き換えるという例で、これは目からウロコでした・・・!

これ、ウィンドウ関数を使えばできるのかー!!まじかー

まとめ

DBのパフォーマンス問題で悩んでいるような人は一度読んでおいて損はないのではないのかなと思います。

ただ、MySQLやSQL Severなどで最近採用されているクラスターインデックスの話なんかはこの本ではサポートされていない(まだ読んでいない箇所に書かれていなければ・・・)ので、そういった製品を利用している場合はその辺りについても併せて知識を得ておくとよさそうです。
(実際このあたりの製品使っているとクラスターインデックスの理解大事なんですよ。。。)