sys.dm_exec_text_query_plan (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-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  

Se även

sys.dm_exec_query_plan (Transact-SQL)