我刚刚开始了解 SQL Server 上的内存使用情况。使用SQL Server 2008 R2 "Ghost Memory" 问题答案中的查询时?,我发现单个数据库占用了缓冲池中的大部分空间。进一步看,使用sys.allocation_units
and sys.indexes
,我确认这可能是由于数据库中大量使用索引造成的。大多数索引都是聚集的。
另一位数据库开发人员认为我们在服务器上存在内存问题 - 由于没有可用内存,查询开始运行很长时间。
我的问题是——这些索引的使用,以及它们在缓冲池中的存在,是否会占用其他进程可用的内存?
是的,缓存在缓冲池中的已用索引的数据页将占用数据缓存中的空间。但是不要让这让你远离使用索引(首先,聚集索引是实际的表数据,所以也要记住这一点)。使用索引(当然是正确设计和实现的)是一件好事。
您的内存问题很可能不是因为您的表上有索引。深入研究内存问题,究竟是什么问题?您的页面预期寿命低吗?你的内存在服务器上是如何配置的?最大服务器内存是否限制了缓冲池的大小?
要获取数据缓存中索引页的细分,您可以运行以下查询:
要通过数据库获取这些统计信息:
索引消耗缓冲池空间,是的。这是您应该注意索引策略并尽量减少重复的另一个原因。
请记住,聚集索引就是表。除了堆(通常是不希望的)之外,聚集索引存在的唯一开销是非叶索引页和聚集键包含在该表的所有非聚集索引中。这就是为什么窄簇键是首选的原因。
Kimberley Tripp 关于集群键选择的文章是一个很好的参考。