有没有办法强制索引保留在 SQL Server 2008 的内存中?

Bra*_*ann 11 performance index sql-server-2008 sql-server buffer-pool

我有一个包含数百万行的表,我需要不时从中运行一些查询。第一个查询通常会很慢(大约 10 秒),随后的查询通常会更快(大约 1 秒)。几个小时后,一个缓慢/然后快速的循环再次开始。

我已经在我的执行计划中检查了所有需要的索引都存在并得到了适当的使用,我认为性能差异是由于索引实际上在内存中用于后续查询(我是对的,还是有其他可能的原因?)

我还使用索引运行了许多其他查询,但这些查询耗时较少,性能也不那么重要,所以我担心这些索引实际上是将我的关键索引从内存缓存中推出。

除了明显的“添加更多 RAM”修复之外,我一直在考虑编写虚拟查询脚本,使其每小时运行一次,以强制索引返回内存。

有没有更优雅的方法来做到这一点?就像暗示 SQLServer 的一种方式,如果它只有足够的内存来保持一个索引缓存,它应该是那个?

我知道通常最好的办法是不要在这类事情上搞砸 SQLServer,但是我的查询的不寻常性质(很少运行,但对时间要求严格)让我相信它是有意义的(如果可能的话) .

我也很想知道是否有办法知道在给定时间哪些索引缓存在内存中?

Aar*_*and 13

曾经有一个DBCC PINTABLE命令,但我相信它在 6.5 或 7.0 中停止工作。如果您尝试,该声明可能仍会表明它有效,但它只是返回,它确实是空操作。

不幸的是,实际上没有任何方法可以控制将哪些索引保存在缓存中 - 我所知道的对于周期性热的表的最佳解决方法是手动保持它们热(您已经在问题中描述过)。

对于哪些索引在内存中,您可以从sys.sm_os_buffer_descriptors. 我发布了一个关于这个的提示:

http://www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-and-object/

  • 还有它的碎片化程度......它正在测量页面,而不是数据。您的页面可能相对空白,这可能会导致度量膨胀。 (2认同)