Kérdés: meg tudom-e nézni egy hosszan futó SQL DML lekérdezésnél, hogy a mögötte futó operátorok (join, index seek, stb.) hány százaléknál járnak?
SQL Server 2014-től igen!
Nézzük a következő (buta) lekérdezést:
SET STATISTICS PROFILE ON; GO --Next, run your query in this session select * from [dbo].[Nums] n1 cross join dbo.Nums n2;
Ez egy lassú, sok soros cross join, csak demó célra. A vizsgálandó lekérdezést olyan sessionben kell futtatni, amiben a STATISTICS PROFILE be van kapcsolva.
Így néz ki a végrehajtási terve:
A terv fontos a következőkhöz, azért raktam ide. És most jön a lényeg: sys.dm_exec_query_profiles. Ő mutatja meg, belül mi zajlik:
SELECT node_id,physical_operator_name, SUM(row_count) row_count, SUM(estimate_row_count) AS estimate_row_count, CAST(SUM(row_count)*100 AS float) / SUM(estimate_row_count) PercentComplete FROM sys.dm_exec_query_profiles --WHERE session_id=54 GROUP BY node_id,physical_operator_name ORDER BY node_id;
A végrehajtás kezdetén így néz ki a kimenete (ha valaki tud tippet adni, hogy lehet ezt SyntaxHighlighterrel jól formázni megköszönöm):
node_id physical_operator_name row_count estimate_row_count PercentComplete 0 Parallelism 1320422 4294967295 0.030743470422631 1 Nested Loops 1323284 4294967296 0.0308101065456867 2 Clustered Index Scan 15 100000 0.015 3 Table Spool 1323284 1410065408 0.0938455757082157 4 Clustered Index Scan 400000 400000 100
Egy perccel később:
node_id physical_operator_name row_count estimate_row_count PercentComplete 0 Parallelism 15917761 4294967295 0.370614254002137 1 Nested Loops 15920504 4294967296 0.370678119361401 2 Clustered Index Scan 161 100000 0.161 3 Table Spool 15920504 1410065408 1.12906138322911 4 Clustered Index Scan 400000 400000 100
Mit jelen ez? A terv alapján van két clustered index scanünk. Az egyik felolvasta a táblában található 400000 sort, azzal ő végzett is. Aztán a cilusos join elkezdi hozzávenni a tábla sorait, minden sorhoz 400000-et. Az egész eredménye belekerül a Table Spoolba, majd csurog ki a Parallelism operátoron keresztül (ami Gather Stream műveletet hajt végre, azaz összegyűjti a több szál által összerakott sorokat egy streambe, mivel párhuzamos a terv).
Lássuk be, marha érdekes látni, hogy áll belül egy nagyobb DML művelet, nem?
Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.