Where子句优化

时间:2013-04-16 20:32:21

标签: sql-server tsql

我正在尝试优化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))

我试图提出案件,或者如果,但它只是不适合我。

5 个答案:

答案 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应用于函数表达式。