为什么不经常使用的整个索引存储在缓冲池中?

Tec*_*270 5 index sql-server memory sql-server-2008-r2

我一直在查看服务器的内存使用情况,并在深入研究细节时发现了一些奇怪的东西。一个索引占用了大约 15GB 的缓冲池。这恰好是整个索引的大小。关于这个特定索引的更多说明:

  • 它不是复合索引。只包含一个字段
  • 该字段的基数相对较低(55 个不同的值)
  • 索引存在于一个有 50 亿条记录的表上
  • sys.dm_db_index_usage_stats DMV 显示了 51 个组合的 user_scans 和 user_seeks
  • sys.dm_db_index_usage_stats DMV 还显示了 1,159,987 个 user_updates

引出几个问题:

  1. 为什么这个很少使用的索引会在缓冲池中占用如此多的空间?
  2. 与低数量的扫描和搜索相比,高数量的 user_updates 不是由于维护开销而使其成为删除的候选者吗?
  3. 应该首先索引具有如此低基数的字段吗?
  4. 是从缓冲池中清除它以删除和重新创建的唯一方法吗?在生产机器上清除整个缓存或缓冲池显然是不可能的

我是一名试图成为 DBA 的开发人员,所以请耐心等待;)

小智 3

SQL Server 有某种 LRU(最近最少使用)机制来从缓冲池中删除内容。问题是,您的索引已被使用 - 每当数据更改时它都会更新,这就是它仍在缓冲池中的原因。

由于基数较低,该索引很可能不会被查询使用。如果这样的索引“覆盖”查询并阻止它们从聚集索引执行键查找,那么它是合理的,但如果情况并非如此,并且假设您查看真实的负载,那么该索引很有可能是已删除。当然 - 只有在仔细检查后才删除索引..