sql查询需要花费太多时间再使用where子句

时间:2018-01-25 16:46:51

标签: sql-server

我正在使用sql server 2012 for asp.net。

原始代码大约需要2秒钟。

select sl.pnum, st.lastEntered, sum(sl.idx) from products p
join spartlist sl on (sl.idx=p.pnumidx)
join shipping_T sht on p.shippingIdx = sht.idx
join sales_T st on sht.shippingOutIdx = st.idx
join itemFrom_T ift on st.custIdx = ift.custidx
where ift.idx not in (1, 2, 19, 33, 34, 44, 45, 46, 47, 17)
group by sl.pnum, st.lastEntered
order by st.lastEntered desc

再添加一个where子句使其执行超过10分钟!

select sl.pnum, st.lastEntered, sum(sl.idx) from products p
join spartlist sl on (sl.idx=p.pnumidx)
join shipping_T sht on p.shippingIdx = sht.idx
join sales_T st on sht.shippingOutIdx = st.idx
join itemFrom_T ift on st.custIdx = ift.custidx
where ift.idx not in (1, 2, 19, 33, 34, 44, 45, 46, 47, 17) and 
st.lastentered > dateadd(wk, -4, getdate())
group by sl.pnum, st.lastEntered
order by st.lastEntered desc

有人可以给我建议这么长时间以及如何解决它, 而且我必须根据这个来编写查询,这是一个很好的做法.. 练习查询优化?

谢谢!

2 个答案:

答案 0 :(得分:1)

另一个小改进是为你要比较的日期创建一个变量。

DECLARE @d DATETIME = dateadd(wk, -4, getdate())

然后在你的选择中.....

..
st.lastentered > @d

这样可以节省为每一行调用的GETDATE和DATEADD。

答案 1 :(得分:0)

您可以使用SQL Server中的执行计划检查查询,并且可以检查查询中的内容。 可能是缺失或不正确的索引,或者是执行计划导致的任何其他内容。