2015-10-14 59 views
2

我正试图调整一些查询的性能。通常情况下,我会在查询执行之间执行下面的语句,以确保我开始新鲜,与正在高速缓存中没有数据页:如何清除SQL Server RDS实例上的SQL Server数据缓存?

DBCC DROPCLEANBUFFERS 

不幸的是,RDS不给我们任何人访问的“系统管理员“的角色,所以我不能执行该语句。我收到以下错误信息:

User 'myuser' does not have permission to run DBCC DROPCLEANBUFFERS. 

有另一种方式,迫使我的查询运行,就好像它们正在运行的第一次,而无需使用任何缓存的数据?

编辑:我应该清楚,我没有使用存储过程,我只是在SSMS中执行临时查询来测试解决问题的方法。我不认为这与重新编译存储过程有关。

回答

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); 
+0

我不使用存储过程。我相当确信我的问题是SQL Server缓存数据,而不是我的代码。 – KOTJMF

+0

@KOTJMF没问题,你可以使用'SELECT'语句,我在我的回答中提到 – wiretext

+0

谦虚请求** downvoter **请留下评论,以便我可以改进我的答案或了解最新错误 – wiretext