我正在使用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
有人可以给我建议这么长时间以及如何解决它, 而且我必须根据这个来编写查询,这是一个很好的做法.. 练习查询优化?
谢谢!
答案 0 :(得分:1)
另一个小改进是为你要比较的日期创建一个变量。
DECLARE @d DATETIME = dateadd(wk, -4, getdate())
然后在你的选择中.....
..
st.lastentered > @d
这样可以节省为每一行调用的GETDATE和DATEADD。
答案 1 :(得分:0)
您可以使用SQL Server中的执行计划检查查询,并且可以检查查询中的内容。 可能是缺失或不正确的索引,或者是执行计划导致的任何其他内容。