sql-server - 如何清除 SQL Server RDS 实例上的 SQL Server 数据缓存?

标签 sql-server amazon-rds

我正在尝试调整某些查询的性能。通常,我会在查询执行之间执行以下语句,以确保我重新开始,没有缓存任何数据页:

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/

相关文章:

sql-server - 检查列是否为 NULL 或在表中包含 NULL。 - 微软 SQL 服务器

amazon-web-services - 在 AWS RDS 中, "managed"和 "fully managed"服务有什么区别?

sequelize.js - 如何使用 Sequelize 处理 RDS 集群中的新副本?

oracle - AWS RDS Oracle 标准版似乎忽略了 NLS_LENGTH_SEMANTICS

SQL 查询 - 如果没有可用值,则选择 0

sql server读取没有内部标签的xml

sql-server - Sqoop 无法从 Sql Server 导入数据

sql-server - 如何使 SQL 中的 AND 条件可选

amazon-rds - Amazon RDS SQL Server 在数据库级别设置时区

amazon-web-services - 无法创建从时间点快照配置新实例的 CloudFormation RDS 模板