下面的存储过程是否会在每次运行时重新编译,因为其中的dynamicSQL? 这种方法有没有什么严重的performance?
CREATE PROCEDURE MyStoredProcedure AS BEGIN DECLARE @column varchar(3) SELECT @column = 'd' + CAST(DAY(GETDATE()) AS char) EXEC ('SELECT ' + @column + ' FROM t1') END
如果可能,最好避免使用dynamicSQL。 有关更详细的讨论,请参阅此SO线程 。 但是,要特别解决您的问题: EXEC ('SELECT d21 FROM t1')语句的行为与服务器接收到来自包含脚本SELECT d21 FROM t1的客户端的请求完全相同。 如果该计划已经在caching中,它将从caching中执行(省略一些细节,如元数据版本更改等)。 如果没有,它将被编译,创build一个新的计划,并运行。 请注意, SELECT field FROM Table这样的查询就是所谓的“ 普通计划查询 ”,在大多数系统上,为这样的事情生成计划的成本是完全可以忽略不计的。
不,每次运行都不应重新编译过程,即使这样做,调用的性能也不会太差,因为dynamicSQL已经变慢了。 该过程的这一部分将在每次运行时进行分析和执行。