SQL Server缓存问题

Abe*_*ler 11 performance caching sql-server-2005

当我第一次运行某个存储过程时,大约需要2分钟才能完成.当我第二次运行时,它在大约15秒内完成.我假设这是因为在第一次运行后所有内容都被缓存了.在我第一次运行此程序之前,我是否可以"加热缓存"?缓存信息是仅在我再次使用相同参数调用相同存储过程时使用,还是在我使用不同参数调用相同存储过程时使用?

Chr*_*tta 11

执行查询时,数据将以块的形式读入内存.这些块保留在内存中,但它们会"老化".这意味着块被标记为最后一次访问,并且当Sql Server需要另一个块用于新查询并且内存缓存已满时,最近最少使用的块(最旧的)被踢出内存.(在大多数情况下 - 全表扫描块会立即老化,以防止全表扫描超出内存并阻塞服务器).

这里发生的事情是,来自第一个查询的内存中的数据块还没有被踢出内存,因此可以用于第二个查询,这意味着可以避免磁盘访问并提高性能.

所以你的问题实际上是在问"我可以将我需要的数据块放入内存而不将其读入内存(实际上是在进行查询)吗?".答案是否定的,除非您想要缓存整个表并将它们永久驻留在内存中,从您描述的查询时间(以及数据大小)开始,这可能不是一个好主意.

提高性能的最佳选择是查看查询执行计划,看看更改索引是否可以提供更好的结果.这里有两个主要方面可以提高性能:

  • 创建一个索引,查询可以使用一个索引来避免低效查询和全表扫描
  • 向索引添加更多列以避免第二次磁盘读取.例如,您有一个查询返回A和C上带有where子句的列A和B,并且您在列A上有一个索引.您的查询将使用列A的索引,需要读取一个磁盘,但需要第二个磁盘点击获取B列和C列.如果索引中包含所有列A,B和C,则可以避免第二个磁盘命中以获取数据.