where语句中的条件使我的SQL查询耗时过长
我有一个简单的查询,其中我得到一个日期范围内所有订单的列表 这就是我查询的where语句中的条件使我的SQL查询耗时过长,sql,sql-server,Sql,Sql Server,我有一个简单的查询,其中我得到一个日期范围内所有订单的列表 这就是我查询的WHERE子句的样子 WHERE o.Company_Code = LEFT(@Site,2) AND o.Division_Code = RIGHT(@Site,3) AND o.Customer_Number = 'ecom2x' AND o.Date_Entered BETWEEN @FromDate AND DATEADD(dayofyear, 1, @ToDate) ORDER BY o.d
WHERE
子句的样子
WHERE o.Company_Code = LEFT(@Site,2)
AND o.Division_Code = RIGHT(@Site,3)
AND o.Customer_Number = 'ecom2x'
AND o.Date_Entered BETWEEN @FromDate AND DATEADD(dayofyear, 1, @ToDate)
ORDER BY
o.date_entered DESC
它通过读取参数site来选择哪个公司,该参数的值类似于“09001”(在该查询生成的报告中选择)
我想添加功能,以便能够查看来自所有公司的所有订单。因此,我在报告中添加了一个参数选项“All”,其值为“00000”
这是我新的WHERE
子句
WHERE
o.Customer_Number = 'ecom2x'
AND o.Date_Entered BETWEEN @FromDate AND DATEADD(dayofyear, 1, @ToDate)
AND ((@Site = '00000') OR (o.Company_Code = LEFT(@Site, 2)
AND o.Division_Code = RIGHT(@Site, 3)))
ORDER BY
o.date_entered DESC
其想法是,如果站点参数为00000,则不应检查订单的公司或部门代码。如果它不是00000,那么它会定期检查它
用硬编码的值运行这个查询似乎很有效,几乎可以立即得到结果,但当我尝试将其作为报告运行时,它需要几分钟,并且经常崩溃 这可能是关于and和ORs的操作顺序 试试这个:
WHERE
o.Customer_Number = 'ecom2x'
AND o.Date_Entered BETWEEN @FromDate AND DATEADD(dayofyear, 1, @ToDate)
AND ((@Site = '00000')
OR
(o.Company_Code = LEFT(@Site,2) and o.Division_Code = RIGHT(@Site,3)))
order by o.date_entered desc
通常,
或
的条件很难优化。一种方法是将查询拆分为两个查询,并使用union all
。在@Site='00000'
之后,您似乎有一个不想要的省略,或者您忘记在省略中包含WHERE子句的最后两行。请再次检查我的理解,如果@Site
没有值'00000',是否应忽略在@FromDate和DATEADD(dayofyear,1,@ToDate)
之间输入的条款o.Customer\u Number='ecom2x'和o.Date\u?(目前是)为了确保您在报告和测试中运行相同的查询:使用Sql Profiler捕获报告应用程序执行的运行查询,并将其与您用于测试的查询进行比较。您还可以使用相同的工具获取所选的执行计划,并将其与您的查询在SSMS中使用的执行计划进行比较。@Igor。我明白你的意思,不过我想你是指括号。我已经实现了MouseMaster解决方案,但问题仍然存在。我更改了代码以匹配您的代码,因为您的代码实际上是正确的,但问题仍然存在,并且查询仍然超时。然后我建议使用Gordon Linoff的multi query+union all建议,或者查看相关表是否可以使用新索引