首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何清除SQL Server RDS实例上的SQL Server数据缓存?

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

Stack Overflow用户
提问于 2015-10-15 00:47:58
回答 1查看 1.3K关注 0票数 3

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

代码语言:javascript
运行
复制
DBCC DROPCLEANBUFFERS

不幸的是,RDS不允许我们访问"sysadmin“角色中的任何人,所以我不能执行该语句。我得到以下错误消息:

代码语言:javascript
运行
复制
User 'myuser' does not have permission to run DBCC DROPCLEANBUFFERS.

有没有其他方法可以强制我的查询像第一次运行一样运行,而不使用任何缓存数据?

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

EN

回答 1

Stack Overflow用户

发布于 2015-10-15 01:31:11

首次编译或重新编译过程时,将针对数据库及其对象的当前状态优化过程的查询计划。如果数据库的数据或结构发生重大更改,则重新编译过程会针对这些更改更新和优化过程的查询计划。这可以提高过程的处理性能。

有时必须强制重新编译过程,有时则自动执行重新编译。每当SQL Server重新启动时,都会自动重新编译。如果过程引用的基础表发生了物理设计更改,也会发生这种情况。

强制过程重新编译的另一个原因是为了对抗过程编译的“参数嗅探”行为。SQL Server执行过程时,过程在编译时使用的任何参数值都将包含在生成查询计划的过程中。如果这些值表示随后调用过程时使用的典型值,则该过程在每次编译和执行时都会从查询计划中受益。如果过程上的参数值经常是非典型的,则强制重新编译过程和基于不同参数值的新计划可以提高性能。

SQL Server提供了过程的语句级重新编译功能。SQL Server重新编译存储过程时,只编译导致重新编译的语句,而不编译整个过程。

如果过程中的某些查询经常使用非典型值或临时值,则可以通过在这些查询中使用RECOMPILE查询提示来提高过程性能。由于只会重新编译使用查询提示的查询,而不是整个过程,因此将模拟SQL Server的语句级重新编译行为。但是,在编译语句时,除了使用过程的当前参数值外,RECOMPILE查询提示还使用存储过程内的任何局部变量的值。

代码语言:javascript
运行
复制
CREATE PROCEDURE dbo.uspProcedure @Param1 varchar(30)
WITH RECOMPILE
AS
    SET NOCOUNT ON;
    SELECT 1

Doc您还可以仅使用with select语句

代码语言:javascript
运行
复制
CREATE PROCEDURE dbo.uspProcedure @Param1 varchar(30)
    AS
        SET NOCOUNT ON;
        SELECT 1 FROM tblName OPTION (RECOMPILE);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33131159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档