有没有办法在SQL Server中预编译存储过程?我的要求是这样的... 我有一些存储过程,编译所需时间比执行更长。因此,我想预编译所有的存储过程。最好在数据库服务器启动和运行时预编译它们。如果您有任何想法,将不胜感激!
编写一个脚本,使用“SET FMTONLY ON”执行每个存储过程。
该过程将被编译,但在执行过程中不会对数据库进行永久更改。无法在使用临时表(#table语法)的过程中使用此选项。
这是微软在Visual Studio中确定存储过程输出的方式。
SET FMTONLY ON
。 - Martin Smith是否可能只执行存储过程而不影响任何数据?如果是,那么您可能可以找到一种在服务器启动时触发此存储过程的方法。
存储过程应该只在创建和首次执行时编译(以及仅创建查询计划)。
如果您经常使用WITH RECOMPILE,那么您应该停止使用。如果您这样做是为了强制重新计算查询计划,因为不同的参数与不同的查询计划一起更有效(并且如果这在性能方面很重要),则需要考虑为不同的查询计划创建不同的SP,可能还需要一个“父”SP来决定调用哪个。但这并不是一个无痛的过程。
如果您的表实际上处于小于百万行的范畴,那么我会特别注意索引和保持统计数据最新,并在空闲时间定期重新编译以保持查询计划的高效性。一旦您进入数千万或数亿行的范畴,那么可能有理由经历复制的痛苦。
如今编译时间很少是重要的。将此代码插入程序顶部,亲自体验一下编译所需的时间是多么短。
SET STATISTICS TIME ON
GO
你会发现编译时间通常以0ms
的形式给出,这意味着太小而不值得关注,而执行时间则在几十、几百甚至几千毫秒之间。