是否可以通过SQL Server 2008强制索引保留在内存中?


10

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

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

我还使用索引来运行许多其他查询,但是这些查询耗时较少,其性能也不太关键,因此我担心那些索引实际上会将关键索引从内存缓存中推出。

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

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

我知道通常最好的办法是不要将SQLServer与这类事情搞混,但是我查询的异常性质(运行很少,但是时间紧迫)使我相信这样做(如果可能) 。

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

Answers:


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/


嗯,根据该脚本,一个75 MB的表正在占用900 MB的缓冲池。那正常/可能吗?
db2 2012年

1
@ db2您有几个索引?
JNK 2012年

2
还有它是多么零散...它是在测量页面,而不是数据。您的页面可能相对空白,这可能会导致度量指标过高。
亚伦·伯特兰

0

尝试使用KEEPPLANKEEPPLAN FIXED 查询提示

KEEPPLAN强制查询优化器放宽查询的估计重新编译阈值。

KEEPFIXED PLAN会由于统计信息的变化而强制查询优化器不重新编译查询。指定KEEPFIXED PLAN可以确保仅在更改基础表的模式或针对这些表执行sp_recompile时才重新编译查询。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.