ありがちな罠
実践でけっこうありそうな(というか、今のプロジェクトで実際にあった)ネタをひとつ。
以下のようなデータ抽出要件があったとしよう。
グループコードに 123 を含むようなグループのリストを取得したい。ついでに、そのグループにぶら下がったアイテムの総数もつけてね。
すぐに思いつきそうな実装その1。
SELECT g.groupcode, i.cnt FROM groups INNER JOIN (SELECT itemcode, COUNT(*) FROM item GROUP BY groupcode) i ON g.groupcode = i.groupcode WHERE g.groupcode LIKE '%123%'
すぐに思いつきそうな実装その2。
SELECT g.groupcode, (SELECT COUNT(*) FROM item WHERE groupcode = g.groupcode GROUP BY groupcode) cnt FROM groups g WHERE groupcode LIKE '%123%'
この場合、後者の方がまともな実行計画を生成する。
(昼休みが終わってしまったので、解説はまた後日)