Разлив памяти в dmvs - PullRequest
       54

Разлив памяти в dmvs

0 голосов
/ 15 мая 2018

В sql server 2014, можем ли мы найти запросы, которые вылились в базу данных tempdb с помощью dmvs?

1 Ответ

0 голосов

Конечно, легко просто запросить XML, сгенерированный планом выполнения. Следующий запрос показывает 50 самых худших запросов с предупреждениями в плане выполнения.

Разливы отображаются в виде предупреждений в плане выполнения точно так же, как и ошибки преобразования, вы можете отфильтровать возвращаемые элементы, сделав подсчет более ограничительным, если вы не просто ищете слово warning . Вы также можете посмотреть на сканы таблицы. Поиграй с этим. Вот запрос:

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

enter image description here

Part2 Ваш вопрос

Доступ к вашим планам выполнения из DMV позволяет вам находить все, что показано в плане выполнения, например запросы, которые генерируют сканирование таблиц и игнорируют индексы:

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, которую вы используете.

...