最近,我意识到临时存储过程,并为我在职业生涯中从未见过它们使用过而感到震惊。当我记得这CREATE PROCEDURE
必须是其批次的第一个语句时,我感到非常失望,这肯定限制了它们的使用。当我看到他们在这个网站上很少被提及时,我支持了这个想法。他们甚至没有标签!
临时存储过程的惯用用例是什么?他们如何避免因需要成为批次中的第一个语句而造成的限制?
最近,我意识到临时存储过程,并为我在职业生涯中从未见过它们使用过而感到震惊。当我记得这CREATE PROCEDURE
必须是其批次的第一个语句时,我感到非常失望,这肯定限制了它们的使用。当我看到他们在这个网站上很少被提及时,我支持了这个想法。他们甚至没有标签!
临时存储过程的惯用用例是什么?他们如何避免因需要成为批次中的第一个语句而造成的限制?
常见的
临时存储过程最常见的用途是:
ASYNC_NETWORK_IO
等待干扰:链接这确实不是它们的好处或用处。你找错树了。
权限和程序
在某些环境中,作为顾问,我可能没有权限将存储过程创建为永久对象。
这可能是因为我的用户帐户具有的访问级别,或者因为各种变更管理流程不允许临时创建它们。
在这些情况下,创建一个可以正常执行的临时存储过程通常比编辑存储过程将其转换为运行一次脚本要快。
这也是一种有用的技术,可以测试对现有存储过程的更改,而不必担心意外覆盖当前正在使用的内容。
应用端
假设开发人员主要使用某种 ORM 来生成查询,并且它们是参数化的。如果我想探索其中之一的调优机会,我在 SSMS 中的选择有些有限。
在许多情况下,使用局部变量作为替代品会给你带来奇怪的查询计划,并且如果问题是参数嗅探,则使用带有局部变量的重新编译提示可能不合适。
在这些情况下,我可以:
这两个选项对于测试来说都是等效的,但通常临时存储过程路径更快,因为我不必担心用单引号将它们加倍。
您还可以通过添加前缀 ## 而不是 ## 来创建全局临时存储过程。在SSMS中,您可以使用GO终止符来分隔批次。对于正常的临时存储过程,它的范围仅限于会话,并且只要会话处于活动状态,它就会存在。对于全局临时存储过程,任何会话都可以访问它,并且只要创建它的会话仍然打开,它就存在。
我用它们来调整性能。如果您想针对生产数据库的日志传送副本(处于备用/只读模式)尝试新版本的存储过程,它们特别有用。我通常编写存储过程的脚本 - 在名称前加上 ##(全局临时存储过程)并进行我需要的任何更改。然后,我可以在另一个 SSMS 窗口中获取捕获的查询,并在其前面加上 ## 来测试新版本。
另一种选择是编写过程脚本,删除 CREATE PROC,将参数定义更改为 DECLARE,然后根据需要设置参数值。创建临时存储过程更好 - 它更容易,并且您还可以像使用常规存储过程一样进行参数嗅探。