tryプログラミング、リモートワーク、田舎暮らし、音楽、etc.2011-03-25SQLとの付き合い方SQLはじめに先日、会社のメンバーから「SQLのJOIN文を視覚的に理解する」というサイトを紹介されました。IDEA*IDEAおいらも見てみたのですが、「自分がSQLを書いたり読んだりする時はこんなベン図を思い浮かべることはまずないなあ」というのが正直な感想でした。そこで、おいらがSQLを書いたり読んだりする時の思考過程をアウトプットするとどうなるだろうかと考えてみました。SQLを書く場合おいらの場合、以下のような手順でSQLを組み立てています。ルートとなるテーブル(出力のメインデータ)を決める。ベースとなるSQLを書き始めます。テーブルによっては大量のデータを抱え込んでいる可能性がありますので、とりあえず件数だけを確認するようにします。ルートのテーブルのフィルター条件をWHERE句に書く。このとき、数万件以上のデータが存在するような大きなテーブルであれば、フィルター条件に使うカラムにINDEXが作成されていることを確認します。SQLを実行し、1件以上のデータが存在することを確認する。この時点でレスポンスが極端に遅かったりすると、INDEXが使われていない可能性が高いです。そのテーブルに存在しないデータがどのテーブルにあるか探す。ER図が用意されていればER図も参考にしてみましょう*1。ルートのテーブルと接続先のテーブルに、結合条件のキーとなるカラムが存在することを確認する。このとき、接続先テーブルのカラムにINDEXが作成されていることを確認します(たいていの場合、主キーとなるカラムが含まれるはずです)。接続先のテーブルにデータが存在しないケースがあるか確認する。このとき、テーブル間のデータ異常は考慮しません。正常なデータしか存在していないという仮定で、データが存在しないケースがあるかどうかを確認します。「99%ありえないけど、もしかしたら」なんて考えだすと、全部外部結合になってしまいます。JOIN(外部結合)を使う。JOIN(等結合)を使う。JOINを使うケースが8割以上だと思います。結合先のデータが正しく取得できていることを確認する。レスポンスが極端に落ちたり、返却される行数が異様に増減したりした場合はテーブルの結合条件が間違っている可能性が高いので、SQLを見直します。必要なテーブルを一通り結合し終わるまで、上記4〜8の手順を繰り返す。一気に複数のテーブルを結合すると問題がおきやすいので、一つずつ確認していきましょう。必要とされるカラムをSELECT句に指定する。ここからは仕上げの段階です。SELECT句を正しく指定します。見た目的におかしい点などがあれば手直しします。このとき、並び順が毎回一意になることが保証できるような条件を考えます。なければ、データベース側の都合である日突然並び順が変わってしまうことがありえるからです。