[MSSQL] UNION と UNION ALL でパフォーマンス差が100対0の場合がある

ユニオンクエリを使う場合のチューニングテクニックです。

SQL で固定値をテーブルのようにして使うケースにユニオンを使う場合があります。ユニオンクエリは「UNION」と「UNION ALL」の2種類を見かけますが、パフォーマンスが大きく違います。

SELECT 1 AS NUM, 'ichi' AS JPN
UNION
SELECT 2, 'ni'
UNION
SELECT 3, 'san'

UNION の場合は、重複を省く役目があるので、そのため処理に差が出ます。上記ははっきりと各行が違うにも関わらず「本当に重複無い?確認しよう」と、データの重複を確認する処理が入ります。

SELECT 1 AS NUM, 'ichi' AS JPN
UNION ALL
SELECT 2, 'ni'
UNION ALL
SELECT 3, 'san'

UNION ALL の場合は「重複無いはずだよね、それでは次に…」と先の処理に進みます。

この例で、100%:0% のパフォーマンス差が出ます。Management Studio でクエリを開き、上記を続けて入力してから「Ctrl+L」で推定実行プランが出ます。

SQL チューニングをするときに、UNION を見かけたとき、重複しないことがわかっている場合は UNION ALL にしてみましょう。