Merge Into语句执行变慢

wwfxgm 2020-12-08 02:03:43
我的一个Merge Into一句。在服务器重启之前,速度是很正常的。 但是上个星期因为断电,导致服务器重启了,现在每次执行这个merge into 语句,居然速度需要6秒多。以前是1秒多搞定。

PS: 单独执行里面的select 语句都是很快的。就是merge into的时候,速度才很慢。

有没有如何检查原因的办法?


Procedure executed successfully

时间: 6.597s


具体语句如下:
ALTER procedure dbo.P_gys_book
@xn varchar(9),@xq int
as
begin
set nocount on

--declare @xn varchar(9) = '2019-2020',@xq int = 1;
merge into dbo.gys_book a
using (select @xn xn,@xq xq,a.gys,A.isbn,a.jcmc,a.jczz,a.cbs,a.listprice,a.zk,a.CK_zsje,a.CK_total,a.CK_qty,b.RK_zsje,b.RK_total,b.RK_num rk_qty
from
(select a.xn,a.xq,c.isbn,c.jcmc,c.jczz,c.cbs,c.gys,d.listprice ,d.zk,sum(b.qty) as CK_qty,round(sum(d.listprice*d.zk*b.qty),2) CK_zsje,sum(d.listprice*b.qty) CK_total
from dbo.OrderHeader a INNER JOIN dbo.OrderDetail b ON a.id = b.orderid
INNER JOIN dbo.Jcjbxxb c on b.bookid = c.id
inner join dbo.Jcjbxxb_ListPriceHistory d on c.id = d.bookid and a.xn = d.xn and a.xq =d.xq


where a.xn = @xn and a.xq= @xq
group by a.xn,a.xq,c.isbn,c.jcmc,c.jczz,c.cbs,c.gys,d.listprice,d.zk
) a
left join
(select xn,xq,isbn,gys,sum(num) as RK_num,isnull(sum(total),0) as RK_total,sum(zsje) as RK_zsje from guest.jcrkb where xn = @xn and xq = @xq GROUP BY xn,xq,isbn,gys
) as b ON a.xn = b.xn and a.xq = b.xq and a.isbn = b.isbn and a.gys = b.gys) b on (a.xn = b.xn and a.xq = b.xq and a.gys = b.gys and a.isbn = b.isbn )

when matched then
update
set a.ck_zsje = b.ck_zsje,a.ck_total = b.ck_total,a.ck_qty = b.ck_qty,a.rk_zsje = b.rk_zsje,a.rk_total = b.rk_total,a.rk_qty = b.rk_qty,a.price = b.listprice,a.cbs = b.cbs ,a.jcmc = b.jcmc,a.jczz = b.jczz

when not matched then
insert (xn,xq,gys,isbn,jcmc,jczz,cbs,price,zk,ck_zsje,ck_total,ck_qty,rk_zsje,rk_total,rk_qty)
values(b.xn,b.xq,b.gys,b.isbn,b.jcmc,b.jczz,b.cbs,b.listprice,b.zk,b.ck_zsje,b.ck_total,b.ck_qty,isnull(b.rk_zsje,0),isnull(b.rk_total,0),isnull(b.rk_qty,0));






--统计影响的行数

select @@rowcount;
end;
...全文
1651 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

把参数赋值给另外新建的值就可以了

wwfxgm 2020-12-22
  • 打赏
  • 举报
回复
经过反复的编译,还是没有解决。只要是在存储过程执行,就速度慢。 单独执行速度倒是很快。
chengangcsdn 2020-12-15
  • 打赏
  • 举报
回复
如果 把存储过程里的语句 copy出来 速度快,执行存储过程就很慢 大概率是 参数嗅探引发。 我以前也遇到过 重新 编译一下存储过程,就快了。 EXEC sp_recompile N'procedureName';
wwfxgm 2020-12-10
  • 打赏
  • 举报
回复
引用 4 楼 吉普赛的歌 的回复:
应该是参数嗅探。 在存储过程的AS前面加一个 WITH RECOMPILE 试下看看。
这个with recompile ,经过测试,也没有什么用。还是需要那么多时间。 最关键的是,以前好的。就是断电重启以后不行了。 然后,我对比了执行计划, 发现 存储过程和查询器执行语句, 居然还不一样。 这个真是奇怪了。
吉普赛的歌 2020-12-10
  • 打赏
  • 举报
回复
应该是参数嗅探。 在存储过程的AS前面加一个 WITH RECOMPILE 试下看看。
wwfxgm 2020-12-10
  • 打赏
  • 举报
回复
单独执行语句速度是很快 执行存储过程就很慢
wwfxgm 2020-12-10
  • 打赏
  • 举报
回复
引用 1 楼 吉普赛的歌 的回复:
从服务器上备份出来, 放本地执行呢?
这个经过反复测试, 我把存储过程的语句复制出来,开窗口单独执行,速度都是超级快的。 就是执行exec dbo.p_gys_book 这样速度就很慢。
吉普赛的歌 2020-12-09
  • 打赏
  • 举报
回复
从服务器上备份出来, 放本地执行呢?

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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