首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server缓存

SQL Server缓存
EN

Stack Overflow用户
提问于 2012-08-17 00:06:38
回答 3查看 193关注 0票数 1

我有一个查询,它在运行时最初需要大约9秒才能返回,在随后的重新运行时大约需要4秒。读完这篇文章后,我认为这是计划缓存的一种表现形式(尽管我可能错了)。我正在尝试优化这个查询,这种效果使得优化变得相当困难。

我对这是一个计划缓存问题的分析是正确的,还是有其他选择?如果是这样,有没有办法在本地禁用这种缓存(即:针对一个查询,而不是针对服务器)。

最后,选项(重新编译)如何适合这个讨论。

顺便说一下,我使用的是SQL server 2008,

EN

回答 3

Stack Overflow用户

发布于 2012-08-17 01:28:24

可以使用'FREEPROCCACHE‘清除计划缓存

有关如何从缓存中清除特定计划的示例,请参阅this MSDN page

也就是说,除非它是一个非常长的SQL语句,否则编译计划不会花费4秒,因此很可能是数据缓存导致您的查询在第一次执行后运行得更快。

票数 2
EN

Stack Overflow用户

发布于 2012-08-17 00:17:03

这很可能不是计划缓存,而是数据缓存是罪魁祸首。有两种方法可以解决这个问题。在开发服务器上,您可以运行DROPCLEANBUFFERS来清除数据缓存。您还应该使用查询计划和统计信息来进行优化。在这种情况下,您可以SET STATISTICS IO On并专注于逻辑读取,而不是物理读取。如果在清除数据缓存之后运行该查询两次,您将看到物理读取急剧下降,但逻辑读取将保持不变。

代码语言:javascript
复制
`OPTION RECOMPILE` 

将只影响计划缓存,并且仅在查询计划本身由于传递不同参数而更改的情况下才会有所不同,例如,当结果集的大小发生显著变化时。

以减少逻辑读取?一般来说,索引和覆盖索引会出现在脑海中。如果查看执行计划,如果SQL server认为需要索引,它可能会提出建议。它实际上会为您提供适当的create index语法(尽管新的索引并不总是有用的)。另外,在实际的执行计划中,如果返回的行数与预期的行数有很大的不同,那么您可能需要查看统计数据。SQL server维护索引列的统计信息,但是如果auto stats没有打开,那么如果where语句包含一个未索引的列,那么您可能需要为该列生成统计信息(或者为它建立索引,或者打开auto stats )。

票数 1
EN

Stack Overflow用户

发布于 2012-08-17 00:12:26

这里有很多因素在起作用,但在进行查询优化时,避免计划/数据缓存、数据库上的其他负载等影响的一种方法是专注于logical reads。这是需要完成的读取次数-对于给定的运行,它们是否来自缓存并不相关。

示例:

代码语言:javascript
复制
USE AdventureWorks2012;
GO       

SET STATISTICS IO ON;
GO
SELECT * 
FROM Production.ProductCostHistory
WHERE StandardCost < 500.00;
GO
SET STATISTICS IO OFF;
GO

结果:

代码语言:javascript
复制
Table 'ProductCostHistory'. Scan count 1, logical reads 5, physical 
reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, 
lob read-ahead reads 0.

在调优查询时,请将重点放在尽可能降低逻辑读取上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11991287

复制
相关文章

相似问题

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