当程序第一次编译或重新编译时,该过程的查询计划针对数据库及其对象的当前状态进行了优化。如果数据库对其数据或结构进行重大更改,则重新编译过程更新并优化过程针对这些更改的查询计划。这可以提高过程的处理性能。
有时需要强制执行程序重新编译,有时候会自动执行程序重新编译。每当SQL Server重新启动时都会发生自动重新编译。如果该过程引用的基础表经历了物理设计更改,也会发生这种情况。
强制重新编译过程的另一个原因是为了抵消过程编译的“参数嗅探”行为。当SQL Server执行过程时,过程在编译时使用的任何参数值都包含在生成查询计划的一部分中。如果这些值代表随后调用该过程的典型值,那么每次编译和执行时,该过程都会从查询计划中受益。如果该过程上的参数值经常是非典型的,则强制重新编译该过程,并根据不同的参数值创建新计划可以提高性能。
SQL Server具有语句级重新编译过程的功能。当SQL Server重新编译存储过程时,只编译导致重新编译的语句,而不是完整的过程。
如果某个过程中的某些查询经常使用非典型值或临时值,那么可以通过在这些查询中使用RECOMPILE查询提示来改善过程性能。由于只有使用查询提示的查询将被重新编译而不是完整的过程,因此SQL Server的语句级重新编译行为将被模仿。但是,除了使用过程的当前参数值之外,编译语句时,RECOMPILE查询提示还会使用存储过程内部任何局部变量的值。
CREATE PROCEDURE dbo.uspProcedure @Param1 varchar(30)
WITH RECOMPILE
AS
SET NOCOUNT ON;
SELECT 1
Doc 您还可以使用select语句只使用
CREATE PROCEDURE dbo.uspProcedure @Param1 varchar(30)
AS
SET NOCOUNT ON;
SELECT 1 FROM tblName OPTION (RECOMPILE);
我不使用存储过程。我相当确信我的问题是SQL Server缓存数据,而不是我的代码。 – KOTJMF
@KOTJMF没问题,你可以使用'SELECT'语句,我在我的回答中提到 – wiretext
谦虚请求** downvoter **请留下评论,以便我可以改进我的答案或了解最新错误 – wiretext