我正在尝试调整某些查询的性能。通常,我会在查询执行之间执行以下语句,以确保我重新开始,没有缓存任何数据页:
DBCC DROPCLEANBUFFERS
不幸的是,RDS 不允许我们访问“sysadmin”角色中的任何人,因此我无法执行该语句。我收到以下错误消息:
User 'myuser' does not have permission to run DBCC DROPCLEANBUFFERS.
是否有另一种方法可以强制我的查询像第一次运行一样运行,而不使用任何缓存数据?
编辑:我应该清楚,我没有使用存储过程,我只是在 SSMS 中执行临时查询以测试解决问题的方法。我认为这与重新编译存储过程无关。
最佳答案
当一个过程被第一次编译或重新编译时,过程的查询计划针对数据库及其对象的当前状态进行了优化。如果数据库的数据或结构发生重大变化,则重新编译过程会针对这些变化更新和优化过程的查询计划。这可以提高程序的处理性能。
有时必须强制重新编译过程,有时则自动进行。只要重新启动 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 您也可以仅使用 with select 语句
CREATE PROCEDURE dbo.uspProcedure @Param1 varchar(30)
AS
SET NOCOUNT ON;
SELECT 1 FROM tblName OPTION (RECOMPILE);
关于sql-server - 如何清除 SQL Server RDS 实例上的 SQL Server 数据缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33131159/