調べてみると、以下のようなSQLが紹介されていました。
SELECT
MIN(ID + 1) AS GAP
FROM testtable
WHERE (ID+1) NOT IN ( SELECT ID FROM testtable);
MIN(ID + 1) AS GAP
FROM testtable
WHERE (ID+1) NOT IN ( SELECT ID FROM testtable);
で、NOT INを使うので、インデックスが使われないのでは?と思い、相関副問い合わせを使ったSQLに書き換えてみました。
SELECT
MIN(ID + 1) AS GAP
FROM testtable
WHERE NOT EXISTS(
SELECT 'x'
from testtable t0
WHERE
t0.ID = testtable.ID+1
)
MIN(ID + 1) AS GAP
FROM testtable
WHERE NOT EXISTS(
SELECT 'x'
from testtable t0
WHERE
t0.ID = testtable.ID+1
)
実行プランを見てみると、結果両方ともインデックスが使われていないことがわかりました。しかし、インデックスなしのフィールドで同SQLを実行すると相関副問い合わせのほうが若干よい結果となりました。
相関副問い合わせであればインデックスが使われるはずなんですが。。。