SQL Server单查询内存使用率

SQL Server单查询内存使用率,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我想了解或至少估计一个特定查询在执行时会占用多少内存。在这里发布查询没有任何意义,因为我希望对多个查询执行此操作,并查看不同数据库是否有变化。有没有办法得到这些信息 使用SQLServer2008R2 谢谢 Gilad.您可能希望了解DMV动态管理视图,特别是。例如,请参见以下查询: 在发出上述查询时,它将等待某个查询运行并收集内存数据。因此,要使用它,只需运行上面的查询,然后运行您要监视的查询。一个查询占用多少内存是什么意思?您到底想知道什么 我认为SQL Server中的内存并不像您想象的那

我想了解或至少估计一个特定查询在执行时会占用多少内存。在这里发布查询没有任何意义,因为我希望对多个查询执行此操作,并查看不同数据库是否有变化。有没有办法得到这些信息

使用SQLServer2008R2

谢谢


Gilad.

您可能希望了解DMV动态管理视图,特别是。例如,请参见以下查询:


在发出上述查询时,它将等待某个查询运行并收集内存数据。因此,要使用它,只需运行上面的查询,然后运行您要监视的查询。

一个查询占用多少内存是什么意思?您到底想知道什么

我认为SQL Server中的内存并不像您想象的那样工作—SQL Server中的内存管理是一个极其复杂的主题—您可以轻松地编写有关SQL Server内存管理的整本书。我不能说自己对SQL Server内存管理了解得那么多,但我知道,如果知道一个查询占用了多少内存,那么几乎没有什么有用的信息可以推断出来

也就是说,如果您确实想在执行查询时了解内存中发生了什么,那么我可能会从查看缓冲池开始。SQL Server中几乎所有内存都被组织成8KB的块,大小与一页内存相同,可用于存储从数据页或索引页到缓存查询计划的任何内容。缓冲池是SQL Server中的主要内存组件—其他地方未使用的所有8KB内存块都保留在缓冲池中,用作数据页的缓存

请注意,为了使用数据页或索引页,它必须存在于内存中——这意味着,如果它在其他内存中还没有准备好使用,则必须提供一个可用的缓冲区,以便将页准备好。缓冲池既是一个可消耗的空闲缓冲池,也是内存中已有页面的缓存

您可以使用DMV检查缓冲池中的内容,本页列出了一个合适的查询:

通过使用命令DBCC DROPCLEANBUFFERS清除缓冲池,不要在生产SQL SERVER上执行此操作!!!然后执行查询,理论上,缓冲池中出现的新页面应该是上次查询中使用的页面

这可以让您大致了解查询中使用的数据和索引页,但不包括SQL Server中使用内存的其他区域,如查询计划缓存、SQL Server工作区等

正如我所说,SQL Server内存管理非常复杂——如果您真的想了解更多,我建议您购买一本关于SQL Server内部结构的书

更新:您还可以使用查询统计信息查看查询的聚合性能统计信息,包括从磁盘读取的物理读取页面和从缓冲池读取的日志读取页面。有关合适的查询,请参阅

这也可能会给你一些关于查询使用了多少内存的更多提示,但是请注意,我发现查询执行的逻辑读取比物理读取多得多,就我所知,这意味着它们一次又一次地读取相同的页面,即100次逻辑读取!=缓冲池中使用了100页

DECLARE @mgcounter INT
SET @mgcounter = 1
WHILE @mgcounter <= 5 -- return data from dmv 5 times when there is data
BEGIN
    IF (SELECT COUNT(*)
      FROM sys.dm_exec_query_memory_grants) > 0
    BEGIN
             SELECT *
             FROM sys.dm_exec_query_memory_grants mg
                         CROSS APPLY sys.dm_exec_sql_text(mg.sql_handle) -- shows query text
             -- WAITFOR DELAY '00:00:01' -- add a delay if you see the exact same query in results
             SET @mgcounter = @mgcounter + 1
    END
END