dmvs 中的内存溢出
Memory Spill in dmvs
在 sql 服务器 2014 中,我们可以使用 dmvs 找到溢出到 tempdb 的查询吗?
当然,只需查询执行计划生成的 XML 即可。以下查询显示执行计划中出现警告的前 50 个性能最差的查询。
溢出在执行计划中显示为警告,就像转换错误一样,您可以通过在不只是查找单词 warning[=29 的情况下使计数更具限制性来过滤返回的项目=].您也可以查找 table 扫描件。玩一玩吧。这是查询:
SELECT [TSQL]= st.text,
qp.query_plan
FROM (
SELECT TOP 50 *
FROM sys.dm_exec_query_stats
ORDER BY total_worker_time DESC
) AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
WHERE qp.query_plan.value('declare namespace p="http://schemas.microsoft.com/sqlserver/2004/07/showplan";count(//p:Warnings)', 'int') > 0
第 2 部分您的问题
从 DMV 访问您的执行计划允许您找到执行计划中显示的任何内容,例如生成 tables 扫描并忽略索引的查询:
DECLARE @Table_Name sysname = N'Orders';
;WITH XMLNAMESPACES(DEFAULT N'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
SELECT
[TSQL]=st.text
,Schema_Name=operators.value('(TableScan/Object/@Schema)[1]','sysname')
,[Table]=operators.value('(TableScan/Object/@Table)[1]','sysname')
,[Index]=operators.value('(TableScan/Object/@Index)[1]','sysname')
,[Physical]= operators.value('@PhysicalOp','nvarchar(50)')
,[Occurance]= cp.usecounts
,qp.query_plan
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
CROSS APPLY query_plan.nodes('//RelOp') rel(operators)
WHERE operators.value('@PhysicalOp','nvarchar(60)') IN ('Table Scan')
AND operators.value('(TableScan/Object/@Table)[1]','sysname') = QUOTENAME(@Table_Name,'[');
前段时间从 SQLTips 中提取了原件,并且将适用于大多数版本,只需确保执行计划包含您要查找的数据。
也许可以分享您的计划和您正在使用的 SQL 版本。
在 sql 服务器 2014 中,我们可以使用 dmvs 找到溢出到 tempdb 的查询吗?
当然,只需查询执行计划生成的 XML 即可。以下查询显示执行计划中出现警告的前 50 个性能最差的查询。
溢出在执行计划中显示为警告,就像转换错误一样,您可以通过在不只是查找单词 warning[=29 的情况下使计数更具限制性来过滤返回的项目=].您也可以查找 table 扫描件。玩一玩吧。这是查询:
SELECT [TSQL]= st.text,
qp.query_plan
FROM (
SELECT TOP 50 *
FROM sys.dm_exec_query_stats
ORDER BY total_worker_time DESC
) AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
WHERE qp.query_plan.value('declare namespace p="http://schemas.microsoft.com/sqlserver/2004/07/showplan";count(//p:Warnings)', 'int') > 0
第 2 部分您的问题
从 DMV 访问您的执行计划允许您找到执行计划中显示的任何内容,例如生成 tables 扫描并忽略索引的查询:
DECLARE @Table_Name sysname = N'Orders';
;WITH XMLNAMESPACES(DEFAULT N'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
SELECT
[TSQL]=st.text
,Schema_Name=operators.value('(TableScan/Object/@Schema)[1]','sysname')
,[Table]=operators.value('(TableScan/Object/@Table)[1]','sysname')
,[Index]=operators.value('(TableScan/Object/@Index)[1]','sysname')
,[Physical]= operators.value('@PhysicalOp','nvarchar(50)')
,[Occurance]= cp.usecounts
,qp.query_plan
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
CROSS APPLY query_plan.nodes('//RelOp') rel(operators)
WHERE operators.value('@PhysicalOp','nvarchar(60)') IN ('Table Scan')
AND operators.value('(TableScan/Object/@Table)[1]','sysname') = QUOTENAME(@Table_Name,'[');
前段时间从 SQLTips 中提取了原件,并且将适用于大多数版本,只需确保执行计划包含您要查找的数据。
也许可以分享您的计划和您正在使用的 SQL 版本。