Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
where语句中的条件使我的SQL查询耗时过长_Sql_Sql Server - Fatal编程技术网

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建议,或者查看相关表是否可以使用新索引