我正在尝试优化where子句。它反复运行,我试图让查询更快地完成,但或者显着减慢了它的速度。如果你们能提供帮助那就太棒了!
WHERE
((Date1 >= @startdate
AND Date1 <= @enddate
AND @RunBy = 0)
OR (date2 BETWEEN @startdate AND @enddate
AND @RunBy = 1
AND date2 BETWEEN @startdate AND @enddate)
OR (date3 BETWEEN @startdate AND @enddate
AND @RunBy = 2)
OR (date4 >= @startdate
AND date4 <= @enddate
AND @RunBy = 3))
我试图提出案件,或者如果,但它只是不适合我。
答案 0 :(得分:4)
您的where子句可能会被重写为:
WHERE CASE @RunBy
WHEN 0 THEN Date1
WHEN 1 THEN Date2
WHEN 2 THEN Date3
WHEN 3 THEN Date4
END BETWEEN @startdate AND @enddate
这应该加快速度,因为你正在减少正在执行的比较次数。
它也更容易阅读和理解,这是良好编程的本质,它看起来也很酷!
答案 1 :(得分:1)
如果您需要不同的执行计划,则必须使用不同的查询文本。如果date1,date2,date3和date4上有索引,它们将不会与您当前的“多方面”查询一起使用。根据您希望使用的执行计划分为4个查询。
IF @RunBy = 0
BEGIN
SELECT...
FROM ...
WHERE date1 ...
END
ELSE IF @RunBy = 1
BEGIN
SELECT ...
FROM ...
WHERE date2 ...
END
ELSE IF...
答案 2 :(得分:0)
比较您更改&#34;的查询的效果。进入UNION ALLs的OR,例如: 而不是
WHERE (A = @A)
OR (B = @B)
尝试
SELECT ...
FROM ...
WHERE A=@A
UNION ALL
SELECT ...
FROM ...
WHERE B=@B
值得一试。
答案 3 :(得分:0)
我发现date2部分中存在重复的条件。
OR (date2 BETWEEN @startdate AND @enddate
AND @RunBy = 1 AND date2 BETWEEN @startdate AND @enddate)
你可以坚持使用其中一种语法 - 使用BETWEEN或&gt; =和&lt; =组合。不要认为它会导致性能差异。
答案 4 :(得分:0)
这样的东西?
where case @RunBy
when 1 then Date1
when 2 then Date2
when 3 then Date3
when 4 then Date4
else null
end between @startDate and @endDate
这不一定会改进您的查询计划,因为我不相信优化器能够使用Date1-4
列上的任何索引,因为case
是一个函数:indices can' t应用于函数表达式。