Sql server sql查询使用一个以上的where子句花费太多时间

Sql server sql查询使用一个以上的where子句花费太多时间,sql-server,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 itemFr

我正在使用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
有人可以给我一些建议什么需要这么长时间以及如何解决, 我还必须根据这一点编写查询,这是一个很好的实践。。 练习查询优化


谢谢

您可以使用SQL Server中的执行计划检查查询,使用执行计划可以检查查询中花费了这么长时间的内容。
可能是缺少或不正确的索引,或者是执行计划的结果。

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

DECLARE @d DATETIME = dateadd(wk, -4, getdate())
然后在您的选择中

..
st.lastentered > @d

这将保存为每一行调用的GETDATE和DATEADD。

我猜在
st.lastentered上没有索引;因此,必须完成表格扫描。一个好的开始是为您的两个查询提供查询计划。包括两个查询的执行计划,并在此处共享@Larnu Hi Larnu,谢谢您的帮助。。但是如果你不介意的话,你能在回答中详细说明一下吗?我不确定我是否理解你的意思。看看@Cool_Br33ze提供的链接。在“执行计划”窗格上,右键单击它并选择
显示执行计划XML
。然后将其粘贴到链接中并按照说明操作。谢谢。我会调查的。不知道执行计划。OMG。就是这样。更改此项后需要两秒钟!!谢谢我很高兴一直站在我的立场上。