Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-databas i Microsoft Fabric
Returnerar Showplan i textformat för en Transact-SQL batch eller för ett specifikt statement inom batchen. Frågeplanen som specificeras av planhandtaget kan antingen vara cachad eller för närvarande körande. Denna tabellvärda funktion liknar sys.dm_exec_query_plan (Transact-SQL), men har följande skillnader:
- Utdata från frågeplanen returneras i textformat.
- Resultatet av frågeplanen är inte begränsat i storlek.
- Individuella uttalanden inom batchen kan specificeras.
Gäller för: SQL Server (SQL Server 2008 (10.0.x) och senare), Azure SQL Database.
Transact-SQL syntaxkonventioner
Syntax
sys.dm_exec_text_query_plan
(
plan_handle
, { statement_start_offset | 0 | DEFAULT }
, { statement_end_offset | -1 | DEFAULT }
)
Arguments
plan_handle
Är en token som unikt identifierar en frågeexekveringsplan för en batch som har körts och vars plan finns i plancachen, eller för närvarande körs.
plan_handle är varbinary(64).
Plan_handle kan hämtas från följande dynamiska hanteringsobjekt:
statement_start_offset | 0 | STANDARD
Indikerar, i bytes, startpositionen för den fråga som raden beskriver inom texten i dess batch eller bevarade objekt.
statement_start_offset är int. Ett värde 0 indikerar början på batchen. Standardvärdet är 0.
Startoffset för satser kan erhållas från följande dynamiska hanteringsobjekt:
statement_end_offset | -1 | STANDARD
Indikerar, i bytes, slutpositionen för den fråga som raden beskriver inom texten i dess batch eller bevarade objekt.
statement_start_offset är int.
Ett värde på -1 indikerar slutet på omgången. Standardvärdet är -1.
Tabell returnerad
| Kolumnnamn | Datatyp | Description |
|---|---|---|
| dbid | smallint | ID för kontextdatabasen som var i kraft när Transact-SQL-instruktionen som motsvarar den här planen kompilerades. För ad hoc- och förberedda SQL-instruktioner kompilerades ID:t för databasen där -uttrycken kompilerades. Kolumnen är null. |
| Objekt-ID | int | ID för objektet (till exempel lagrad procedur eller användardefinierad funktion) för den här frågeplanen. För ad hoc- och förberedda batchar är den här kolumnen null. Kolumnen är null. |
| number | smallint | Numrerat heltal för lagrad procedur. Till exempel kan en grupp procedurer för orderansökan kallas orderproc; 1, orderproc; 2, och så vidare. För ad hoc- och förberedda batchar är den här kolumnen null. Kolumnen är null. |
| krypterade | bit | Anger om motsvarande lagrade procedur är krypterad. 0 = inte krypterad 1 = krypterad Kolumnen är inte nullbar. |
| query_plan | nvarchar(max) | Innehåller kompileringstids-Showplan-representationen av frågeexekveringsplanen som specificeras med plan_handle. Showplan är i textformat. En plan genereras för varje batch som innehåller till exempel ad hoc-Transact-SQL-instruktioner, lagrade proceduranrop och användardefinierade funktionsanrop. Kolumnen är null. |
Anmärkningar
Under följande förhållanden returneras inget Showplan-resultat i plankolumnen i den returnerade tabellen för sys.dm_exec_text_query_plan:
Om frågeplanen som anges med plan_handle har tagits bort från plancachen är kolumnen query_plan i den returnerade tabellen null. Till exempel kan detta tillstånd uppstå om det finns en tidsfördröjning mellan när planhandtaget fångades och när det användes med sys.dm_exec_text_query_plan.
Vissa Transact-SQL-satser är inte cachade, såsom bulkoperationer eller satser som innehåller strängliteraler större än 8 KB. Showplans för sådana satser kan inte hämtas med hjälp av sys.dm_exec_text_query_plan eftersom de inte finns i cachen.
Om en Transact-SQL batch eller lagrad propud innehåller ett anrop till en användardefinierad funktion eller ett anrop till dynamisk SQL, till exempel med EXEC (sträng), inkluderas inte den kompilerade XML Showplan för den användardefinierade funktionen i tabellen som returneras av sys.dm_exec_text_query_plan för batchen eller den lagrade proceduren. Istället måste du göra ett separat anrop till sys.dm_exec_text_query_plan för den plan_handle som motsvarar den användardefinierade funktionen.
När en ad hoc-fråga använder enkel eller tvingad parameterisering kommer kolumnen query_plan endast innehålla satstexten och inte själva frågeplanen. För att returnera frågeplanen, anropa sys.dm_exec_text_query_plan för planhandtaget för den förberedda parameteriserade frågan. Du kan avgöra om frågan har parametriserats genom att referera till sql-kolumnen i sys.syscacheobjects-vyn eller textkolumnen i sys.dm_exec_sql_text dynamiska hanteringsvyn.
Permissions
För att köra sys.dm_exec_text_query_plan måste en användare vara medlem i sysadmin-funktionen för fast server eller ha behörigheten VIEW SERVER STATE på servern.
Behörigheter för SQL Server 2022 och senare
Kräver BEHÖRIGHET FÖR VISNINGSSERVERNS PRESTANDATILLSTÅND på servern.
Examples
A. Hämta den cachade frågeplanen för en långsamt löpande Transact-SQL-fråga eller batch
Om en Transact-SQL fråga eller batch körs länge på en viss anslutning till SQL Server, hämta exekveringsplanen för den förfrågan eller batchen för att upptäcka vad som orsakar fördröjningen. Följande exempel visar hur man hämtar Showplan för en långsamt löpande fråga eller batch.
Anmärkning
För att köra detta exempel, ersätt värdena för session_id och plan_handle med värden specifika för din server.
Först, hämta sessions-ID (SPID) för processen som kör förfrågan eller batchen genom att använda den lagrade sp_who proceduren:
USE master;
GO
EXEC sp_who;
GO
Resultatmängden som returneras av sp_who indikerar att sessions-ID:t är 54. Du kan använda sessions-ID:t med den dynamiska hanteringsvyn sys.dm_exec_requests för att hämta planhandtaget genom att använda följande fråga:
USE master;
GO
SELECT * FROM sys.dm_exec_requests
WHERE session_id = 54;
GO
Tabellen som returneras av sys.dm_exec_requests indikerar att planhandtaget för den långsamt löpande frågan eller batchen är 0x06000100A27E7C1FA821B10600. Följande exempel returnerar frågeplanen för det angivna planhandtaget och använder standardvärdena 0 och -1 för att returnera alla satser i fråge- eller batchen.
USE master;
GO
SELECT query_plan
FROM sys.dm_exec_text_query_plan (0x06000100A27E7C1FA821B10600,0,-1);
GO
B. Hämtar varje frågeplan från plancachen
För att hämta en ögonblicksbild av alla frågeplaner som finns i plancachen, hämta planhandtagen för alla frågeplaner i cachen genom att fråga den dynamiska hanteringsvyn sys.dm_exec_cached_plans . Planhandtagen lagras i kolumnen plan_handle i sys.dm_exec_cached_plans. Använd sedan operatorn CROSS APPLY för att skicka planhandtagen till sys.dm_exec_text_query_plan enligt följande. Showplan-utdata för varje plan som för närvarande finns i plancachen finns i kolumnen query_plan i tabellen som returneras.
USE master;
GO
SELECT *
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_text_query_plan(cp.plan_handle, DEFAULT, DEFAULT);
GO
C. Hämta varje frågeplan för vilken servern har samlat in frågestatistik från plancachen
För att hämta en ögonblicksbild av alla frågeplaner för vilka servern har samlat statistik som för närvarande finns i plancachen, hämta planhandtagen för dessa planer i cachen genom att fråga den dynamiska sys.dm_exec_query_stats hanteringsvyn. Planhandtagen lagras i kolumnen plan_handle i sys.dm_exec_query_stats. Använd sedan operatorn CROSS APPLY för att skicka planhandtagen till sys.dm_exec_text_query_plan enligt följande. Showplan-utdata för varje plan finns i kolumnen query_plan i tabellen som returneras.
USE master;
GO
SELECT * FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, qs.statement_start_offset, qs.statement_end_offset);
GO
D. Hämta information om de fem främsta frågorna efter genomsnittlig CPU-tid
Följande exempel visar frågeplanerna och genomsnittlig CPU-tid för de fem vanligaste frågorna. Funktionen sys.dm_exec_text_query_plan specificerar standardvärdena 0 och -1 för att returnera alla satser i batchen i frågeplanen.
SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],
Plan_handle, query_plan
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, 0, -1)
ORDER BY total_worker_time/execution_count DESC;
GO