我正在尝试调优一些查询的性能。通常,我会在查询执行之间执行以下语句,以确保重新开始,没有数据页被缓存:
DBCC DROPCLEANBUFFERS不幸的是,RDS不允许我们访问"sysadmin“角色中的任何人,所以我不能执行该语句。我得到以下错误消息:
User 'myuser' does not have permission to run DBCC DROPCLEANBUFFERS.有没有其他方法可以强制我的查询像第一次运行一样运行,而不使用任何缓存数据?
编辑:我应该清楚,我不是在使用存储过程,我只是在SSMS中执行即席查询来测试解决问题的方法。我不认为这与重新编译存储过程有关。
发布于 2015-10-15 01:31:11
首次编译或重新编译过程时,将针对数据库及其对象的当前状态优化过程的查询计划。如果数据库的数据或结构发生重大更改,则重新编译过程会针对这些更改更新和优化过程的查询计划。这可以提高过程的处理性能。
有时必须强制重新编译过程,有时则自动执行重新编译。每当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 1Doc您还可以仅使用with select语句
CREATE PROCEDURE dbo.uspProcedure @Param1 varchar(30)
AS
SET NOCOUNT ON;
SELECT 1 FROM tblName OPTION (RECOMPILE);https://stackoverflow.com/questions/33131159
复制相似问题