DMVs gebruiken om gebruiksstatistieken en prestaties van views te bepalen
In dit artikel worden de methodologie en scripts beschreven die worden gebruikt om informatie te verkrijgen met betrekking tot de -prestaties van query's die gebruikmaken van Weergaven. De bedoeling van deze scripts is om indicatoren voor het gebruik en de prestaties van verschillende weergaven in een database te bieden.
sys.dm_exec_query_optimizer_info
De DMV sys.dm_exec_query_optimizer_info geeft statistieken weer over de optimalisaties die de SQL Server-query-optimalisator uitvoert. Deze waarden zijn cumulatief en beginnen met opnemen wanneer SQL Server wordt gestart. Zie de architectuurhandleiding voor queryverwerkingvoor meer informatie over de optimalisatie van query's.
In de onderstaande common_table_expression (CTE) wordt deze DMV gebruikt om informatie over de workload te verschaffen, zoals het percentage van de query's dat naar een weergave verwijst. De resultaten die door deze query worden geretourneerd, geven zelf geen prestatieprobleem aan, maar kunnen onderliggende problemen blootstellen in combinatie met klachten van gebruikers over trage query's.
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
Combineer de resultaten van deze query met de resultaten van de systeemweergave sys.views om querystatistieken, querytekst en het uitvoeringsplan in de cache te identificeren.
sys.views
De onderstaande CTE bevat informatie over het aantal uitvoeringen, de totale uitvoeringstijd en de pagina's die uit het geheugen worden gelezen. De resultaten kunnen worden gebruikt om query's te identificeren die mogelijk kandidaten zijn voor optimalisatie.
Notitie
De resultaten van deze query kunnen variƫren, afhankelijk van de versie van SQL Server.
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
De laatste query bevat informatie over ongebruikte weergaven met behulp van de DMV-sys.dmv_exec_cached_plans. De cache van het uitvoeringsplan is echter dynamisch en de resultaten kunnen variƫren. Als zodanig gebruikt u deze query in de loop van de tijd om te bepalen of een weergave daadwerkelijk wordt gebruikt of niet.
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