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