日期:2014-05-17  浏览次数:20405 次

一个SQL语句优化 优化····
语句如下:


select InDate,Stock.LotNo,Stock.ModelName,Stock.ModelNo,Type,Stock.LotQty,isnull(InQty,0) as InQty,isnull(OutQty,0) as OutQty,StockQty,isnull(StopQty,0) as StopQty,Stock.LotQty-isnull(inqty,0) as Subassy,Remark 
from @Stock as Stock left join StockOutStop on Stock.LotNo = StockOutStop.LotNo
left join @StockIn si on si.LotNo= Stock.LotNo and si.ModelNo=stock.ModelNo
left join @StockOut so on so.LotNo=Stock.LotNo and so.ModelNo=stock.ModelNo
where ( StockQty>0 or StockQty<0) or (Stock.LotQty-isnull(inqty,0)>0 or Stock.LotQty-isnull(inqty,0)<0)
or( DATEDIFF(mm,OutDate,getdate())=0 
--or(year(OutDate)=year(getdate()) and Month(OutDate)=Month(getDate()) 
and(StockQty=0 and Stock.LotQty-isnull(inqty,0)=0))

下面是执行效率图:


该怎么优化?

------解决方案--------------------
表变量改成临时表
------解决方案--------------------
大数据量的时候临时表的性能优于表变量,不过最好附上执行计划。
------解决方案--------------------
你哪个表这么大.读取2百W的页..


------解决方案--------------------
( StockQty>0 or StockQty<0) or (Stock.LotQty-isnull(inqty,0)>0 or Stock.LotQty-isnull(inqty,0)<0) 

这卖弄什么?


DATEDIFF(mm,OutDate,getdate())=0  
修改为
OutDate >= convert(varchar(7),getdate(),120) + '01'
and OutDate < dateadd(mm,1,convert(varchar(7),getdate(),120) + '01')
OutDate建立索引