首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL性能:重新编译和删除以及重新应用存储过程

SQL性能:重新编译和删除以及重新应用存储过程
EN

Stack Overflow用户
提问于 2013-06-20 21:57:46
回答 1查看 795关注 0票数 3

我有一个用于DI报告的存储过程,其中包含使用UNION ALL的62个子查询。最近,性能从不到1分钟上升到8分钟以上,使用SQL,它显示了非常高的CPU和读取。该过程当前已传入设置为局部变量的变量,以防止参数嗅探。

将过程的内容作为SELECT语句和性能运行回到不到一分钟的时间。通过Management中的EXEC调用过程和性能是可怕的,超过8分钟。通过EXEC调用过程,包括使用重新编译命令和性能,都没有提高。我运行了DBCC和DROPCLEANBUFFERS,但仍然没有改进。

最后,我放弃了这个程序,重新应用了它,现在性能又恢复了.

有谁能帮我解释一下,为什么最初的步骤没有纠正程序的性能,但是放弃和重新应用程序却做到了呢?

EN

回答 1

Stack Overflow用户

发布于 2013-06-22 22:33:27

听起来像是阻塞参数嗅探产生了一个糟糕的计划。当您使用局部变量时,查询优化器使用每个列的密度来得出基数估计,实质上是对平均值进行优化。如果数据分布严重倾斜,则对于某些值,此估计值将显著偏离。这个理论解释了为什么你最初的步骤不起作用。如果阻塞了参数嗅探,使用WITH、重新编译或运行将不会有帮助。每次都会产生同样的计划。因为您说,将过程的内容作为SELECT语句运行使其更快,这使我认为您实际上需要参数嗅探。但是,如果编译时间是可以接受的,您也需要尝试使用WITH重新编译,否则就有可能因为一个错误的计划而被困在一个错误的嗅探值之上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17224571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档