【发布时间】:2015-04-24 17:57:58
【问题描述】:
我是 SQL Server 的新手(虽然已经在 Linux 上使用过 MySQL)。我有一个数据库,它总是在我的 Windows Server 上使用最大限制。我已经限制了最大内存量,但是我的应用程序很慢。
如何找出哪个 SQL 命令/字符串正在使用我的内存?
【问题讨论】:
标签: sql-server memory memory-management
我是 SQL Server 的新手(虽然已经在 Linux 上使用过 MySQL)。我有一个数据库,它总是在我的 Windows Server 上使用最大限制。我已经限制了最大内存量,但是我的应用程序很慢。
如何找出哪个 SQL 命令/字符串正在使用我的内存?
【问题讨论】:
标签: sql-server memory memory-management
可以通过在 Perfmon 中设置计数器来完成实时内存使用跟踪。设置这些有点麻烦,所以如果您可以运行查询以查看固定时间点,那么 Glenn Berry 有一套非常全面的内存诊断查询,我在我们的 SQL Server 2012 数据库上使用。
https://sqlserverperformance.wordpress.com/2010/10/08/sql-server-memory-related-queries/
在您的情况下使用的特定查询取决于您要查找的是查询还是存储过程。
寻找查询:
-- 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;
寻找存储过程:
-- Top Cached SPs By Total Logical Reads (SQL 2008 and 2008 R2). Logical reads relate to memory pressure
SELECT TOP(25) p.name AS [SP Name], qs.total_logical_reads AS [TotalLogicalReads],
qs.total_logical_reads/qs.execution_count AS [AvgLogicalReads],qs.execution_count,
ISNULL(qs.execution_count/DATEDIFF(Second, qs.cached_time, GETDATE()), 0) AS [Calls/Second],
qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count
AS [avg_elapsed_time], qs.cached_time
FROM sys.procedures AS p
INNER JOIN sys.dm_exec_procedure_stats AS qs
ON p.[object_id] = qs.[object_id]
WHERE qs.database_id = DB_ID()
ORDER BY qs.total_logical_reads DESC;
【讨论】: