Použijte dynamická zobrazení správy k určení statistik využití a výkonu zobrazení.
Tento článek popisuje metodologii a skripty, které se používají k získání informací o výkonu dotazů, které využívají zobrazení. Záměrem těchto skriptů je poskytnout indikátory použití a výkonu různých zobrazení nalezených v databázi.
sys.dm_exec_query_optimizer_info
Zobrazení DMV sys.dm_exec_query_optimizer_info zobrazuje statistiky o optimalizacích provedených optimalizátorem dotazů SQL Serveru. Tyto hodnoty jsou kumulativní a začínají zaznamenávat při spuštění SQL Serveru. Další informace o optimalizátoru dotazů naleznete v Průvodce architekturou zpracování dotazů.
Následující common_table_expression (CTE) používá toto DMV k poskytování informací o zátěži, například procento dotazů odkazujících na zobrazení. Výsledky vrácené tímto dotazem samy o sobě neoznačují problém s výkonem, ale můžou vystavit základní problémy v kombinaci s stížnostmi uživatelů na pomalé dotazy.
WITH CTE_QO AS
(
SELECT
occurrence
FROM
sys.dm_exec_query_optimizer_info
WHERE
([counter] = 'optimizations')
),
QOInfo AS
(
SELECT
[counter]
,[%] = CAST((occurrence * 100.00)/(SELECT occurrence FROM CTE_QO) AS DECIMAL(5, 2))
FROM
sys.dm_exec_query_optimizer_info
WHERE
[counter] IN ('optimizations'
,'trivial plan'
,'no plan'
,'search 0'
,'search 1'
,'search 2'
,'timeout'
,'memory limit exceeded'
,'insert stmt'
,'delete stmt'
,'update stmt'
,'merge stmt'
,'contains subquery'
,'view reference'
,'remote query'
,'dynamic cursor request'
,'fast forward cursor request'
)
)
SELECT
[optimizations] AS [optimizations %]
,[trivial plan] AS [trivial plan %]
,[no plan] AS [no plan %]
,[search 0] AS [search 0 %]
,[search 1] AS [search 1 %]
,[search 2] AS [search 2 %]
,[timeout] AS [timeout %]
,[memory limit exceeded] AS [memory limit exceeded %]
,[insert stmt] AS [insert stmt %]
,[delete stmt] AS [delete stmt]
,[update stmt] AS [update stmt]
,[merge stmt] AS [merge stmt]
,[contains subquery] AS [contains subquery %]
,[view reference] AS [view reference %]
,[remote query] AS [remote query %]
,[dynamic cursor request] AS [dynamic cursor request %]
,[fast forward cursor request] AS [fast forward cursor request %]
FROM
QOInfo
PIVOT (MAX([%]) FOR [counter]
IN ([optimizations]
,[trivial plan]
,[no plan]
,[search 0]
,[search 1]
,[search 2]
,[timeout]
,[memory limit exceeded]
,[insert stmt]
,[delete stmt]
,[update stmt]
,[merge stmt]
,[contains subquery]
,[view reference]
,[remote query]
,[dynamic cursor request]
,[fast forward cursor request])) AS p;
GO
Zkombinujte výsledky tohoto dotazu s výsledky systémového zobrazení sys.views k identifikaci statistik dotazů, textu dotazu a plánu provádění v mezipaměti.
sys.views
Následující CTE poskytuje informace o počtu spuštění, celkové době běhu a čtení stránek z paměti. Výsledky lze použít k identifikaci dotazů, které mohou být kandidáty na optimalizaci.
Poznámka
Výsledky tohoto dotazu se mohou lišit v závislosti na verzi SQL Serveru.
WITH CTE_VW_STATS AS
(
SELECT
SCHEMA_NAME(vw.schema_id) AS schemaname
,vw.name AS viewname
,vw.object_id AS viewid
FROM
sys.views AS vw
WHERE
(vw.is_ms_shipped = 0)
INTERSECT
SELECT
SCHEMA_NAME(o.schema_id) AS schemaname
,o.Name AS name
,st.objectid AS viewid
FROM
sys.dm_exec_cached_plans cp
CROSS APPLY
sys.dm_exec_sql_text(cp.plan_handle) st
INNER JOIN
sys.objects o ON st.[objectid] = o.[object_id]
WHERE
st.dbid = DB_ID()
)
SELECT
vw.schemaname
,vw.viewname
,vw.viewid
,DB_NAME(t.databaseid) AS databasename
,t.databaseid
,t.*
FROM
CTE_VW_STATS AS vw
CROSS APPLY
(
SELECT
st.dbid AS databaseid
,st.text
,qp.query_plan
,qs.*
FROM
sys.dm_exec_query_stats AS qs
CROSS APPLY
sys.dm_exec_sql_text(qs.plan_handle) AS st
CROSS APPLY
sys.dm_exec_query_plan(qs.plan_handle) AS qp
WHERE
(CHARINDEX(vw.viewname, st.text, 1) > 0)
AND (st.dbid = DB_ID())
) AS t;
GO
sys.dmv_exec_cached_plans
Konečný dotaz poskytuje informace o nepoužívaných zobrazeních pomocí zobrazení dynamické správy sys.dmv_exec_cached_plans. Mezipaměť plánu provádění je však dynamická a výsledky se mohou lišit. Proto tento dotaz v průběhu času použijte k určení, jestli se zobrazení skutečně používá, nebo ne.
SELECT
SCHEMA_NAME(vw.schema_id) AS schemaname
,vw.name AS name
,vw.object_id AS viewid
FROM
sys.views AS vw
WHERE
(vw.is_ms_shipped = 0)
EXCEPT
SELECT
SCHEMA_NAME(o.schema_id) AS schemaname
,o.name AS name
,st.objectid AS viewid
FROM
sys.dm_exec_cached_plans cp
CROSS APPLY
sys.dm_exec_sql_text(cp.plan_handle) st
INNER JOIN
sys.objects o ON st.[objectid] = o.[object_id]
WHERE
st.dbid = DB_ID();
GO