ありがちな罠

実践でけっこうありそうな(というか、今のプロジェクトで実際にあった)ネタをひとつ。

以下のようなデータ抽出要件があったとしよう。

グループコードに 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%'

この場合、後者の方がまともな実行計画を生成する。
(昼休みが終わってしまったので、解説はまた後日)