最近、SQL Server 2008 で実際の値ではなく、フィルターで変数を参照すると、クエリが大幅に遅くなることに気付きました。たとえば、次のようになります。
SELECT table_A.fruit
, SUM(table_B.units)
FROM table_A LEFT JOIN table_B
ON table_A.fruit = table_B.fruit_name
WHERE time_of_sale BETWEEN '2012-11-01' AND '2012-11-25'
よりも速い
DECLARE @date1 DATE = '2012-11-01'
, @date2 DATE = '2012-11-25'
SELECT table_A.fruit
, SUM(table_B.units)
FROM table_A LEFT JOIN table_B
ON table_A.fruit = table_B.fruit_name
WHERE time_of_sale BETWEEN @date1 AND @date2
クエリをこれに変更すると、最初に投稿したクエリと同じくらい高速になります。
DECLARE @date1 DATE = '2012-11-01'
, @date2 DATE = '2012-11-25'
DECLARE @exec VARCHAR(8000)
SELECT @exec =
'
SELECT table_A.fruit
, SUM(table_B.units)
FROM table_A LEFT JOIN table_B
ON table_A.fruit = table_B.fruit_name
WHERE time_of_sale BETWEEN ''' + @date1 + ''' AND ''' + @date2 + '''
'
EXEC(@exec)