Is there a way to force an index to stay in memory with SQL Server 2008?
There used to be a DBCC PINTABLE
command but I believe that stopped working in 6.5 or maybe 7.0. The statement will probably still suggest that it worked if you try it, but it just returns, it really is a no-op.
Unfortunately there's not really any way to control which indexes are kept in cache - the best workaround I know of for tables that are periodically hot is to keep them hot manually (which you've already described in your question).
For which indexes are in memory, you can get a rough idea from sys.sm_os_buffer_descriptors
. I published a tip about this:
http://www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-and-object/