やる気がストロングZERO

やる気のストロングスタイル

SQL実践入門を読んだ

SQL実践入門気になってたので読んだ。 かなり体系的に理解できて良かった。

読み切ってしまってから記憶だけで振り返ってるので内容に間違いなどはあるかも。
気になる場合は読んでみることをおすすめします。

どんな内容の本か?

SQLをただ使うだけならSQLの構文を理解していればいいけど、 実際はそうはいかないシーンがある。

SQLDBMSがどのように実行しデータを取得しているのかを解説し、そこからどのようなSQLがパフォーマンスを発揮できるのかを理解するのを助けてくれるような内容だった。

各章の所感

1章 DBMSアーキテクチャ

ざっくりとDBMSの構成要素の解説や、 SQL(抽象)からデータ取得(実装)がどのように行われるのかを解説している。 パーサやオプティマイザによる実行計画や、テーブルスキャンやコストの話。

以後のSQLの組立時に「なぜこのSQLはパフォーマンスが出ないのか」の解説がたくさんでてくるが、 この章の内容が頭に入っているとイメージしやすかった。

2章 SQLの基礎

基本的なSQL構文の解説。 個人的な話として、ウィンドウ関数についてこれを読んで初めて理解できた。 今まで存在は知ってたがイマイチ何なのか良くわかってなかった。(SQL構文の参考書にウィンドウ関数って出てこなくない?)

3章,4章,5章 SQLにおける条件分岐、集約とカット、ループ

SQLで複雑なデータ出力(条件分岐や分類分けなど)をしたいケースがあるが、その際のDBMS的な考え方を解説している。 プログラミング的な手続き脳で書いてしまうとパフォーマンスが出にくくなる場合が多いので、DBMS的(集合的)な考え方で実現するSQL例をサンプル豊富に説明している。

なかなか自分ではたどり着けなかったであろう書き方が盛りだくさんなので非常に参考になる。

個人の所感としては、こういった書き方はSQLをメンテナンスできる人が限られてきそうなので、シーンによってはパフォーマンスを犠牲にしてもアプリケーション側に処理を任せることで単純なSQL(この本で言うところのぐるぐる系)で済ませるという道は選んでしまいそうだなと思った。

6章 結合

JOINの内部的な実現方法(Nested Loops, Hash, Sort Merge)についての解説。 このあたりがわかると、JOINのコスト感がイメージしやすくなる。

実行計画を見た際のイメージもつきやすくなった。

7章 サブクエリ

サブクエリはコストがかかるという話

8章 SQLにおける順序

複雑な集計処理をする際に行をナンバリングできるとそれを使って色々とやりやすくなる。 そのノウハウをサンプルとともに解説。

理解しながら読むのに時間がかかった。

9章 更新とデータモデル

様々なシーンにおけるSQLでの効率的な書き方の解説。

ここも理解しながら読むのに時間がかかった。

個人的な経験に照らし合わせると、ここまで複雑な事情はSQLのみで解決させるより、アプリケーション側で実装したくなってしまう。

10章 インデックスを使いこなす

インデックスについての解説。 知っていると、不要にインデックスを付加してしまうことはなくなりそう。 インデックスオンリースキャンは知っていると手軽にパフォーマンスを向上させられる場合もあるのかなと思ったが、ちょっとした条件の変化(保守によって取得カラムが増えてインデックスオンリースキャンから外れるなど)で不意にパフォーマンスが落ちるなどの危険性があることを認識できたのは良かった。