一个子语句造成查询太慢

SkyLee708 2013-04-03 03:01:32
大查询下,一个子查询,造成90%的占用,一共三个类似查询,加上需要10秒,不加上秒开
(select top 1 cfe4 from a_spmx where spbh=V.spbh and ckbh=V.ckbh and scph=V.scph and dwid=v.dwid and isnull(cfe4,'')<>'') cfe4
一共三个类似的
还有一个
isnull((select top 1 GFBH from k_rkw w left join k_rk t on w.link=t.link where ckbh=v.ckbh and spbh=v.spbh and scph=v.scph order by t.line desc),0) GFBH,
去掉 order by t.line desc 速度就没有问题,加上,需要5秒才开
...全文
411 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
flai 2013-04-06
  • 打赏
  • 举报
回复
SQL语句写得简单点 太复杂了就用临时表
lg314 2013-04-05
  • 打赏
  • 举报
回复
加个索引试一下 create index IX_a_spmx_INDEX on a_spmx (spbh,ckbh,scph,dwid,cfe1,cfe2,cfe3,cfe4,orderby的列)
SkyLee708 2013-04-04
  • 打赏
  • 举报
回复
引用 23 楼 szm341 的回复:
引用 22 楼 szm341 的回复:提个小建议,对性能影响应该不大 isnull(cfe1,'')<>''这个可以简化为cfe1<>'' null<>''是成立的 按错了,没说完 null<>''是成立的,比较的结果是false,对你的筛选来说是适用的,也就是说null的数据比较都是false,所以不用特意去转换
改完后, 索引假脱机开销由37%上升到40%
极品老土豆 2013-04-04
  • 打赏
  • 举报
回复
我就知道不加order by 的top 无意义
极品老土豆 2013-04-04
  • 打赏
  • 举报
回复
我就知道不加order by 的top 无意义
szm341 2013-04-04
  • 打赏
  • 举报
回复
引用 24 楼 SkyLee708 的回复:
改完后, 索引假脱机开销由37%上升到40%
这就是所谓的弄巧成拙吗~看来2000的查询计划还真有出入啊
szm341 2013-04-03
  • 打赏
  • 举报
回复
引用 22 楼 szm341 的回复:
提个小建议,对性能影响应该不大 isnull(cfe1,'')<>''这个可以简化为cfe1<>'' null<>''是成立的
按错了,没说完 null<>''是成立的,比较的结果是false,对你的筛选来说是适用的,也就是说null的数据比较都是false,所以不用特意去转换
szm341 2013-04-03
  • 打赏
  • 举报
回复
提个小建议,对性能影响应该不大 isnull(cfe1,'')<>''这个可以简化为cfe1<>'' null<>''是成立的
發糞塗牆 2013-04-03
  • 打赏
  • 举报
回复
你这样加本来就是多关联了表,也就改变了原有的执行计划,所以性能肯定不一样的。
SkyLee708 2013-04-03
  • 打赏
  • 举报
回复
引用 19 楼 DBA_Huangzj 的回复:
不同的查询可能会有不同的执行计划,特别是需要更多列时。暂时我只能想到这些了
精简到下边
Select 

	(select top 1 cfe1 from a_spmx where spbh=test1.spbh and ckbh=test1.ckbh and scph=test1.scph and dwid=test1.dwid and isnull(cfe1,'')<>'') cfe1
	,(select top 1 cfe3 from a_spmx where spbh=test1.spbh and ckbh=test1.ckbh and scph=test1.scph and dwid=test1.dwid and isnull(cfe3,'')<>'') cfe3
	,(select top 1 cfe4 from a_spmx where spbh=test1.spbh and ckbh=test1.ckbh and scph=test1.scph and dwid=test1.dwid and isnull(cfe4,'')<>'') cfe4
    From 
    V_BAT
    test1
	LEFT JOIN D_CK C ON C.CKBH=test1.CKBH
	LEFT JOIN D_SP S ON S.SPBH=test1.SPBH
Where 
	C.CKBH LIKE '%'
	and S.SPBH LIKE '%'
	and test1.dwid like '0%'
所有的问题都是这个查询造成 test1 是一个随便命名的虚表
發糞塗牆 2013-04-03
  • 打赏
  • 举报
回复
不同的查询可能会有不同的执行计划,特别是需要更多列时。暂时我只能想到这些了
SkyLee708 2013-04-03
  • 打赏
  • 举报
回复
引用 17 楼 DBA_Huangzj 的回复:
实在不行的话,把你那三个(select top 1 cfe1 from a_spmx where spbh=V.spbh and ckbh=V.ckbh and scph=V.scph and dwid=v.dwid and isnull(cfe1,'')<>'') cfe1的先改写成表再关联。
这样做是不是太复杂了
發糞塗牆 2013-04-03
  • 打赏
  • 举报
回复
实在不行的话,把你那三个(select top 1 cfe1 from a_spmx where spbh=V.spbh and ckbh=V.ckbh and scph=V.scph and dwid=v.dwid and isnull(cfe1,'')<>'') cfe1的先改写成表再关联。
SkyLee708 2013-04-03
  • 打赏
  • 举报
回复
引用 15 楼 DBA_Huangzj 的回复:
你是不是tempdb太小了?
spbh=V.spbh and ckbh=V.ckbh and scph=V.scph 注释掉这三个条件,查询速度也正常, 感觉这三个条件和上边的语句里的V.scph V.ckbh V.spbh 定义有问题
發糞塗牆 2013-04-03
  • 打赏
  • 举报
回复
你是不是tempdb太小了?
SkyLee708 2013-04-03
  • 打赏
  • 举报
回复
索引刚才建了,不管用
發糞塗牆 2013-04-03
  • 打赏
  • 举报
回复
a_spmx这个表用到的列加个索引
SkyLee708 2013-04-03
  • 打赏
  • 举报
回复
SELECT 
	GFMC 供方名称,
	仓库,
	商品,
	其它二,
	批号,
	SPSL,
	DFE1,
	每根重量
 	,CFE1
 	,CFE3
 	,CFE4
FROM
    (Select 
	CKMC 仓库,
	s.spmc 品号,
	SPMC 商品,
	ZHBZ 其它二,
	SCPH 批号,
	YESL+isnull((select sum(spsl) from k_rkw w left join k_rk t on w.link=t.link where bstt=0 and ckbh=v.ckbh and spbh=v.spbh and scph=v.scph),0) SPSL, 
	YESL1+isnull((select sum(w.dfe1) from k_rkw w left join k_rk t on w.link=t.link where bstt=0 and ckbh=v.ckbh and spbh=v.spbh and scph=v.scph),0) DFE1,
	YEJE+isnull((select sum(spje) from k_rkw w left join k_rk t on w.link=t.link where bstt=0 and ckbh=v.ckbh and spbh=v.spbh and scph=v.scph),0) 库存成本,
	isnull((select top 1 agsl from k_rkw w left join k_rk t on w.link=t.link where ckbh=v.ckbh and spbh=v.spbh and scph=v.scph),0) 每根重量,
	isnull((select top 1 GFBH from k_rkw w left join k_rk t on w.link=t.link where ckbh=v.ckbh and spbh=v.spbh and scph=v.scph order by t.line desc),0) GFBH
 	,(select top 1 cfe1 from a_spmx where spbh=V.spbh and ckbh=V.ckbh and scph=V.scph and dwid=v.dwid and isnull(cfe1,'')<>'') cfe1
 	,(select top 1 cfe3 from a_spmx where spbh=V.spbh and ckbh=V.ckbh and scph=V.scph and dwid=v.dwid and isnull(cfe3,'')<>'') cfe3
 	,(select top 1 cfe4 from a_spmx where spbh=V.spbh and ckbh=V.ckbh and scph=V.scph and dwid=v.dwid and isnull(cfe4,'')<>'') cfe4
-- 注释掉上面三个查询速度就正常,不注释掉注释就很慢
    From V_BAT V
	LEFT JOIN D_CK C ON C.CKBH=V.CKBH
	LEFT JOIN D_SP S ON S.SPBH=V.SPBH
Where 
	C.CKBH LIKE '%'
	and S.SPBH LIKE '%'
	and v.dwid like '0%'
	) 
	A LEFT JOIN D_GYS S ON A.GFBH=S.GFBH
      WHERE 
	A.GFBH LIKE '%'
 	and round(dfe1,4)<>0
發糞塗牆 2013-04-03
  • 打赏
  • 举报
回复
引用 10 楼 SkyLee708 的回复:
引用 8 楼 DBA_Huangzj 的回复:Eager Spool就是把一个中间结果放到“临时表”中,通常是这个部分要使用多次,可能就是那个切了半边的Nested Loop会rewound这部分数据。 查询特别慢的原因不是Eager Spool引起的。但是,很可能是Statistics不够新,导致那部分数据Filter之后的结果行数估计错误,不当的使用了Neste……
那就更新统计信息先
SkyLee708 2013-04-03
  • 打赏
  • 举报
回复
引用 8 楼 DBA_Huangzj 的回复:
Eager Spool就是把一个中间结果放到“临时表”中,通常是这个部分要使用多次,可能就是那个切了半边的Nested Loop会rewound这部分数据。 查询特别慢的原因不是Eager Spool引起的。但是,很可能是Statistics不够新,导致那部分数据Filter之后的结果行数估计错误,不当的使用了Nested Loop。可以看到Index Scan的结……
微软的这个看不懂,
加载更多回复(9)

34,575

社区成员

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

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