一个SQL语句优化 优化····

沉默又寡言 2013-03-21 02:12:40
语句如下:


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))

下面是执行效率图:


该怎么优化?
...全文
221 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
langxingcs 2013-03-23
  • 打赏
  • 举报
回复
isnull(inqty,0)>0这样的列上应该设置默认值0
昵称被占用了 2013-03-22
  • 打赏
  • 举报
回复
( 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建立索引
Q315054403 2013-03-21
  • 打赏
  • 举报
回复
设计就有问题。。能完成功能或任务也行
沉默又寡言 2013-03-21
  • 打赏
  • 举报
回复
引用 3 楼 SQL77 的回复:
你哪个表这么大.读取2百W的页..
公司以前一人才写的的 我草 执行一次4分钟 尼玛 哪个客户能等这么久
發糞塗牆 2013-03-21
  • 打赏
  • 举报
回复
表变量不能创建索引,好像只能有约束,这对大数据量方面的性能提升没什么用,而且我也测试过CTE,对大数据量也同样没有临时表好。
沉默又寡言 2013-03-21
  • 打赏
  • 举报
回复
引用 2 楼 DBA_Huangzj 的回复:
大数据量的时候临时表的性能优于表变量,不过最好附上执行计划。
果然神人 我会告诉你我用临时表后 只执行10秒就出数据吗
SQL77 2013-03-21
  • 打赏
  • 举报
回复
你哪个表这么大.读取2百W的页..
發糞塗牆 2013-03-21
  • 打赏
  • 举报
回复
大数据量的时候临时表的性能优于表变量,不过最好附上执行计划。
guguda2008 2013-03-21
  • 打赏
  • 举报
回复
表变量改成临时表

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧