2009年8月31日月曜日

[SQL]数値型フィールドで最小の空き番を取得する

先日GDD Blog: [.NET]IDENTITY指定のフィールドはロールバックしても元に戻らない(SQLServerでIDENTITYフィールドの歯抜けについて書きましたが、今日はそれを補完するために、一番小さい空き番を取得するSQLについて書きます。
調べてみると、以下のようなSQLが紹介されていました。

SELECT
    MIN(ID + 1AS GAP
FROM testtable
WHERE (ID+1NOT IN ( SELECT ID FROM testtable);


で、NOT INを使うので、インデックスが使われないのでは?と思い、相関副問い合わせを使ったSQLに書き換えてみました。
SELECT
    MIN(ID + 1AS GAP
FROM testtable
WHERE NOT EXISTS(
    SELECT 'x'
    from testtable t0
    WHERE 
        t0.ID = testtable.ID+1 
)


実行プランを見てみると、結果両方ともインデックスが使われていないことがわかりました。しかし、インデックスなしのフィールドで同SQLを実行すると相関副問い合わせのほうが若干よい結果となりました。
相関副問い合わせであればインデックスが使われるはずなんですが。。。

0 件のコメント: