我正在尝试调整某些查询的性能。通常,我会在查询执行之间执行以下语句,以确保我重新开始,没有缓存数据页:
DBCC DROPCLEANBUFFERS
不幸的是,RDS不允许我们访问“sysadmin”角色中的任何人,因此我无法执行该语句。我收到以下错误消息:
User 'myuser' does not have permission to run DBCC DROPCLEANBUFFERS.
是否有另一种方法可以强制我的查询像第一次运行一样运行,而不使用任何缓存数据?
编辑:我应该清楚,我没有使用存储过程,我只是在SSMS中执行即席查询来测试解决问题的方法。我不认为这与重新编译存储过程有关。
答案 0 :(得分:0)
首次编译过程或重新编译过程时,将针对数据库及其对象的当前状态优化过程的查询计划。如果数据库对其数据或结构进行了重大更改,则重新编译过程更新并优化过程对这些更改的查询计划。这可以提高程序的处理性能。
有时必须强制执行过程重新编译,而有时会自动进行重新编译。重新启动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);