如何查找使用大多数内存进行排序的查询

问题描述:

如何确定哪些查询使用大多数内存进行排序/连接/ etc? 如何确定一个特定查询使用了多少内存?如何查找使用大多数内存进行排序的查询

我希望能找到像SET STATISTICS IO ON这样的个人查询和DMV来找出最坏的罪犯,但我找不到任何。

sys.dm_exec_query_memory_grants

  • requested_memory_kb:总要求,以千字节
  • granted_memory_kb的内存量:总内存量实际上以KB为单位授予。
+0

我点击您的链接,和第一线如下:“没有要等待内存授予不会出现在该视图的查询”如果我的查询使用大量内存但不等待授予,该怎么办?我应该在这种情况下使用什么? – 2012-01-17 22:12:51

+0

任何需要内存授予的查询(以及因此使用大量内存的任何查询)都会显示出来。例如。像'select ... from table where ...'这样的简单查询不会出现,因为它在执行时基本上不需要内存。但是'select ... from table where ... order by [non-indexed-column]'会显示出来,因为它需要一个SORT,它需要内存。 – 2012-01-17 22:29:28

+0

有关*一般*内存问题调查,请参阅[DBCC MEMORYSTATUS](http://support.microsoft.com/kb/907877)。您的问题虽然具体询问关于查询内存授予。 – 2012-01-17 22:33:50

试试这个发现个别高罪犯查询的和他们的执行计划

-- Find single-use, ad-hoc queries that are bloating the plan cache 
SELECT TOP(100) [text], cp.size_in_bytes 
FROM sys.dm_exec_cached_plans AS cp 
CROSS APPLY sys.dm_exec_sql_text(plan_handle) 
WHERE cp.cacheobjtype = N'Compiled Plan' 
AND cp.objtype = N'Adhoc' 
AND cp.usecounts = 1 
ORDER BY cp.size_in_bytes DESC; 

还去Glen Berry's博客,并获得全面的诊断脚本(如果我在上面了)。他有一些非常棒的基于DMV的脚本来查找高IO/Mem/CPU查询(AdHoc和SP)。

好运

+1

这会找到缓存中最大的执行计划 - 不是那些在运行时请求最多内存的计划。 – 2012-01-18 11:51:49