『SQLパフォーマンス詳解』を読んだ

RDBのインデックス作成の戦略や実行計画の読みかたにもう少し詳しくなりたいと思っていたので、この手の話題が体系的にまとめられている『SQLパフォーマンス詳解』を読んだ。今回は和訳版を公式サイトで購入したが、SQLのインデックスとそのチューニングについてのオンラインブックでも同じ内容が読める。

内容

200ページ程度と短くまとまった本であることからわかるように、RDBのインデックスとその効果的な使いかただけに焦点を当てて解説している。書籍で示されている目次とは異なるが、次のような内容にまとめられると思う:

  • インデックスを実現するBツリーについて
  • インデックスの種類(複合インデックス、式インデックス、部分インデックスなど)について
  • (本文では主にOracleだが)実行計画の読み解きかたについて
  • 実行計画をもとにインデックスとクエリをチューニングする方法について

第2章の「where句」の分量が割合として多く、そこでwhereを使うときのチューニング方法や注意点が説明されている。joinやソート(order by)は別の章でそれぞれ説明がある。また、RDBの主要な各プロダクトについて実行計画の読みかたが付録でついていて、その点も便利。

実験用の環境

動かしながらのほうが本の内容を理解しやすいので実験用の環境を作った。

https://github.com/kymmt90/sql-performance-explained

ふだんPostgresを使うことが多いので、Postgresで実験できるようにした。書籍中で出てくるスキーマのテーブルに合わせて、ランダムな値を持つ大量のデータをRubyスクリプトでCSVとして作成し、psqlからcopyコマンドで一括投入することで、データ量の多い環境を再現した。本を読みながら、この環境でインデックスやクエリを変更して実行計画が変わることを確認できたので、理解の促進に役立った。

所感

アプリケーションの開発者がクエリがどのように使われるかを把握しているので、インデックスを効果的に張ることは開発者の仕事である、ということが書いてあったのがよかった。また、読みながらちょっと脇道にそれて、Postgresでlikeでインデックスを使うときは演算子クラスを付与する必要があることや、Postgresの実行計画で出てくるBitmap Heap ScanのRecheckについて次の記事で知ることができたのもよかった。

taityo-diary.hatenablog.jp

RDBの本にしては短くまとまっていて(個人の感想です)、すぐに読めるので、RDBを使うアプリケーションを書く人はみんな読めばいいのではと思いました。