索引消耗内存吗?

JHF*_*HFB 11 sql-server-2008 sql-server

我刚刚开始了解 SQL Server 上的内存使用情况。在问题SQL Server 2008 R2“Ghost Memory”的答案中使用查询时,我发现单个数据库占用了缓冲池中的大部分空间。进一步看,使用sys.allocation_unitssys.indexes,我确认这可能是由于大量使用数据库中的索引造成的。大多数索引都是聚集的。

另一位数据库开发人员认为我们在服务器上存在内存问题 - 由于没有可用内存,查询开始运行很长时间。

我的问题是 - 这些索引的使用以及它们在缓冲池中的存在是否会占用其他进程可用的内存?

Tho*_*ger 13

是的,缓存在缓冲池中的已用索引的数据页将占用数据缓存中的空间。但是不要让这让您放弃使用索引(首先,聚集索引是实际的表数据,因此也要记住这一点)。索引的使用(当然是正确设计和实现的)是一件好事。

您的内存问题很可能不是由表上的索引引起的。深入研究内存问题,究竟是什么问题?您的页面预期寿命是否很低?你的内存在服务器上是怎么配置的?最大服务器内存是否限制了缓冲池的大小?

要获取数据缓存中索引页的细分,您可以运行以下查询:

select
    count(*) as total_page_count,
    count(*) * 8 as total_consumption_kb,
    sum(row_count) as total_row_count
from sys.dm_os_buffer_descriptors
where page_type = 'INDEX_PAGE'
group by page_type
Run Code Online (Sandbox Code Playgroud)

要按数据库获取这些统计信息:

select
    db_name(database_id) as database_name,
    count(*) as total_page_count,
    count(*) * 8 as total_consumption_kb,
    sum(row_count) as total_row_count
from sys.dm_os_buffer_descriptors
where page_type = 'INDEX_PAGE'
group by database_id
order by total_consumption_kb desc
Run Code Online (Sandbox Code Playgroud)


Mar*_*ith 7

索引消耗缓冲池空间,是的。这是您应该注意索引策略并尽量减少重复的另一个原因。

我确认这可能是由于大量使用数据库中的索引造成的。大多数索引都是聚集的。

请记住,聚集索引是表。聚集索引存在于堆之上的唯一开销(这通常是不可取的)是非叶索引页和聚集键包含在该表的所有非聚集索引中。这就是为什么首选窄集群密钥的原因。

金伯利·特里普 (Kimberley Tripp) 关于集群键选择的文章是这方面的极好参考。