kagamihogeの日記

kagamihogeの日記です。

SQL実践入門──高速でわかりやすいクエリの書き方

俺は実務経験をある程度こなしたあと、RDBの知識不足を認識したクチである。改めてRDBを勉強し始めて困ったことの一つは、実行計画の読み方がよくわからないことだった。もちろん、ぐぐればNESTED LOOP JOINが何かとかは出てくるし、公式のマニュアルも参考になる。ただ、webの文献は体系だって解説があるとは限らないし、個人のブログなどは粒度がバラバラで、まとまった量の知識を得るには向いていない。マニュアルも膨大な量があるので慣れていないと目的の文書が書いてあるかどうかすら分からないし、あったとしても必要なレベルの解説があるかどうは分からない。

そこで本書の出番である。既存の書籍にもSQLとパフォーマンスを論じたものはあるにはあるのだが、それに特化した本の存在は、少なくとも俺は知らない。一冊だけ、データベースパフォーマンスアップの教科書 基本原理編 - kagamihogeの日記という極めて体系的に解説した書籍を知っているが、いかんせん500ページ近くあり読むのは気合がいる。

実行計画は、実はただそこに書いてある要素が理解できれば読めるわけではない。テーブルやインデックス等オブジェクトの性質、それらへのアクセスパス、ジョインの方式、どういうSQLがどういう実行計画になりえるか、SQLには現れないが実行計画を左右する統計やCPUやメモリなど物理レベルの要素、そして、それらが組み合わされたときの動作。多様な要素とその相互作用の基本的な性質を理解するのが、実行計画の理解の出発点となる。これを解説しようとすると、個々の要素だけでなく、要素間の関連とそれがSQLとどう繋がるのかもセットで記述しなければならない。しかし、そこはさすがのミック氏で、うまいことコンパクトにまとめるのに成功している(といってもソレナリにはページ数はあるけども)。

本書の他の本にはあまり見られない特徴としては、SQLを集合の世界の住人らしく上手く扱うことが性能の良さに繋がる、という視点にある。すでに同氏の著作達人に学ぶ SQL徹底指南書 - kagamihogeの日記で、SQLを手続でなく集合で扱う解説の手腕の見事さは知られている。本書では、SQLと実行計画の観点から前述のSQL本のエッセンスを凝縮したような形になっている。CASEGROUP BYに慣れていないと最初の方でも読み進めるのは苦戦するかもしれない。ただし、手続でなく集合で宣言的にSQLを書き、手続的に処理手順を書くのでなくRDBMSに任せる、という事を覚えるにつれ、RDBMSブラックボックス的に扱う恐怖感が次第に薄れていく。これは結構な快感である。

しかし、柔軟で表現力に富むSQLにも例外や限界はある。このあたりに対するミック氏のスタンスも見所で、問題の解き方は一つだけではない、という姿勢がそれに当たる。本書の後半では、この問題はあなたならどう解きますか? という問いかけがなされる。当然本書でSQL力をつけたモノとしてはSQLで解きにかかるわけだが、実際には気合でSQLを書く以外の方法もあるよ、と示される。SQLに習熟するのも必要だが、場合によってはSQLでない方法も選ぶべし、とSQLの解説本で主張するのが面白い。他にも、SQL一発でなくループでぐるぐる回すのも完全に否定はせず、そのメリット・デメリットを解説している点などからも氏の柔軟さが伺えて興味深い。

RDBMSがいつの日か完全なものとなり、エンジニアは実行計画など物理レベルのことは全く気にせずとも良い日が来るかもしれない。元々リレーショナルデータベースの理想はそれを目指したわけだが、現実と折り合いをつけるためにやむなく実行計画を見せるようになり、エンジニアもやむなく日々チューニングという名の泥臭い作業に追われることとなった。前述のSQL本でも本書でも、ミック氏は理想を念頭に置きつつ現実に対処する、それがエンジニアの仕事である、と述べている。RDBの分野においては、集合論など理論的な面からSQLを見つつ、個々のベンダーのRDBMSの物理的な特性まで、幅広くしかし自分が必要とする深さまで、学ぶのが良いだろう、と言っている。

本書はその一歩、SQLがどのように実行されるのか、を学ぶ入門書として極めて良く出来ています。

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

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