レガシーコードからの脱却

レガシーな職場でも独学でどうにか頑張っていくブログです。

【読書記録】SQL 実践入門 高速でわかりやすいクエリの書き方

SQL 実践入門 高速でわかりやすいクエリの書き方 ミック[著]

お盆休みということで、2年前くらいに購入して一度読んだきり置いていた『SQL 実践入門』を読み返しました。 本書では主にOraclePostgreSQLで説明されていますが、SQLServerMySQLくらいしか触った経験のない私でも十分読めました。

前半ではDBMSの主な仕組みと基本的なSQLの構文をおさらいした後に、中盤以降は実行計画をみながらよりパフォーマンスのいいクエリとは何かを実例とともに紹介してくれています。

目次は以下の通りです。

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

いちいち、各章のサブタイトルがかっこいい!

以下、メモまたは感想です。

第5章:手続き型の呪縛

パフォーマンスが悪いという知らせを受けて確認してみたら、ぐるぐる系(レコード数分繰り返し処理を行うような実装方法)で書かれていたということは経験あります。

その際、ガツン系のSQLに書き換えるために、相関サブクエリを使ってみたものの、複雑になって結果パフォーマンスはあんまり変わらずということがしょっちゅうでしたので、この章のウィンドウ関数の使用例は感動でした。(ROWS BETWEENを初めて知りました。) SQL Serverでも色々対応されているようなので、ウィンドウ関数をよく勉強しなくて使いこなせるようにならないといけませんね。

第6章:結合を制する者はSQLを制す

スラダンを思い出す章題です(笑)

スカラサブクエリ

結合とは直接的に関係しませんが、以下の相関サブクエリについて書かれた記述が地味に大切だと感じました。

相関サブクエリをスカラサブクエリとして使うと、結果行数の数だけ相関サブクエリを実行することになるため、かなり高コストな処理になるからです。

Nested Loops

SQLチューニングの基本中の基本は「駆動表の小さなNested Loops」+ 「内部表の結合キーにインデックス」!!

Hash

大規模テーブル同士の結合に適している。

第7章:困難は分割するべきか

サブクエリ・パラノイアってどっかで見たことあるぞと思い調べてみましたら、こっちも著者がミック氏でした。

第1回 サブクエリ・パラノイア~副問い合わせ乱用による性能劣化を治療せよ!:SQL緊急救命室|gihyo.jp … 技術評論社

サブクエリのパフォーマンスに対する使いどころとして、先に結合テーブルのレコードを絞るということが書かれていました。

第9章:盲目のスーパーソルジャー

「データモデルを制する者はシステムを制す」は日々感じているので(主に被害者として)、常に心がけていきたいですね。

第10章:秀才の弱点

インデックス利用が有効かの判断基準 カーディナリッティが高く、選択率が10%前後

インデックスが使えないパターンも忘れがちなのでメモしておきます。 どれもインデックスがどんなものかを考えれば、まぁわかりますね。

  • 中央一致、後方一致 ⇒前方の値が決まらないため
  • 索引列で演算 ⇒インデックスに存在するのは演算結果ではなく、計算前の列の値だから
  • 索引列で関数を使用している ⇒上に同じ
  • IS NULL ⇒索引データにNULLは作成されないため
  • 否定形を用いる(<> != NOT IN)

さいごに

約2年ぶりに読み直しましたが、忘れていたりするところもあって大変勉強になりました。 全てのところで具体例とともに説明されているので、非常にわかりやすいです。 実際に時間も2時間ほどで読めたので、大型本に比べて読破のハードルも低いと思います。

そのため、会社の後輩や新人にも是非読んでもらいたいです。(本当は先輩も…)

またミックさんの講演会が8/25にあるというメールが来ていましたが、用事で参加できないのは残念です。

次は、『達人に学ぶSQL徹底指南書』か『SQLアンチパターン』を読みたいですね。

あとはSQLServerも行式サポートしてくれないかなぁー