プログラマでありたい

おっさんになっても、プログラマでありつづけたい

実行計画が解れば怖くない。SQL実践入門

 技術評論社さんから、SQL実践入門を献本いただきました。ありがとうございます。
f:id:dkfj:20150416072810j:plain

SQL実践入門の主題



 この本の目的は、「パフォーマンスの良いSQLの書き方、特に大量データを処理するSQLの性能向上の方法を理解すること」とあります。そのパフォーマンス向上の為の解として、SQLが内部的にどう処理されているかを表す実行計画の読み解き方を、いろいろなケースを上げながらひたすら解説しています。そして、何故その実行計画になるのか、データ構造やDBの動きとともに説明しています。ということで、実行計画大事という基本かつ当たり前のことを、正面から取り扱っている良質のSQL本です。

SQL実践入門の構成



 SQL実践入門の章立ては、下記の通りです。

第1章:DBMSのアーキテクチャ──この世にただ飯はあるか
第2章:SQLの基礎──母国語を話すがごとく
第3章:SQLにおける条件分岐──文から式へ
第4章:集約とカット──集合の世界
第5章:ループ──手続き型の呪縛
第6章:結合──結合を制する者はSQLを制す
第7章:サブクエリ──困難は分割するべきか
第8章:SQLにおける順序──甦る手続き型
第9章:更新とデータモデル──盲目のスーパーソルジャー
第10章:インデックスを使いこなす──秀才の弱点
Appendix A:PostgreSQLのインストールと起動
Appendix B:演習問題の解答

1章の部分は、SQL以前のDBMS全般の知識です。2章が用語解説も兼ねながら、SELECTやGroup By、ビューやサブクエリと各種演算についての解説です。3章から、個々のテーマについて掘り下げて取り扱っています。手っ取り早くSQL力を付けるには、6章の結合の部分を熟読することをお勧めします。最後の10章は、インデックスを取り扱っている関係上、テーブル設計の部分についても言及しています。

Nested Loops, Hash, Sort Merge



 6章の章題の「結合を制する者はSQLを制す」にあるように、SQLのチューニングが必要な場合の殆どは、結合に関するものだと思います。その為、1章を割いて結合に関する解説をしています。結合の種類から動作原理までひと通りの説明があるので、ここを読むだけでだいぶSQL力があがります。内容としては、どのようなデータ構造・サイズであれば、どの結合が向いているのか、またその理由は何かなどで、かなり丁寧に説明しています。時間がない人は、まずはここから押さえると良いでしょう。 

「データベース実践入門」と「SQL実践入門」



 データベース関係といえば、同じく今年出版された「データベース実践入門」があります。こちらも同じ技評さんから出ていて、かなり良い本です。どちらを読めばよいのと聞かれたら、間違いなく両方とも読めと答えますが、どちらから読めば良いのと聞かれると「SQL実践入門」の方から読んだ方がよい人が多いと思います。
 データベース実践入門は、データベース設計の指針です。これに対してSQL実践入門は、SQLを扱うことに特化した本です。DB設計する人は、必然的にSQLを扱うことに習熟している必要があるので、SQL実践入門の方が先かなという気がします。

感想というか、SQLと私



 もう10年近く前ですが、機会があってMySQLの生みの親の一人、"Monty"ことMichael Widenius氏に話を伺ったことがあります。そこで、その当時悩んでいたパフォーマンスの劣化と思われるケースについて質問してみたところ、データの種類や件数、インデックスの情報を伝えると、ディスクI/Oがこれくらいだからこれくらいのパフォーマンスが出るはずと、人間実行計画のような神業を披露して貰ったことがあります。その上で、改善の手立てを指摘してもらいました。その経験があって、SQLのチューニングというのは、動作原理を知ることだということを知ることができました。
 そんなこともあるので、動作原理から理解するというのは重要だと思っています。この本は、様々なケースの実行計画を読み解いて、その動き及び裏にある動作原理について解説しています。そういった点から、SQLの理解が急速に進むのではと思います。職場の若手がSQL触っていたら、是非そっとこの本を脇においてやってください。そんな本です。

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

See Also:
日本一熱いデータベース論、「理論から学ぶデータベース実践入門」