Aracılığıyla paylaş


sys.dm_exec_query_plan (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Plan tutamacı tarafından belirtilen parti için Showplan'ı XML formatında döndürür. Plan kolunda belirtilen plan ya önbelleklenebilir ya da şu anda yürütülmektedir.

Showplan için XML şeması bu Microsoft web sitesinde yayımlanmış ve erişilebilir durumdadır. Ayrıca SQL Server'ın kurulu olduğu dizinde de mevcuttur.

Transact-SQL söz dizimi kuralları

Sözdizimi

sys.dm_exec_query_plan(plan_handle)  

Arguments

plan_handle
Bir grup için benzersiz şekilde tanımlanan ve planı plan önbelleğinde bulunan ya da şu anda yürütülmekte olan bir grup için sorgu yürütme planını benzersiz şekilde tanımlayan bir tokendır. plan_handlevarbinary(64) şeklindedir.

plan_handle aşağıdaki dinamik yönetim nesnelerinden alınabilir:

Döndürülen Tablo

Sütun adı Veri türü Description
dbid smallint Bu plana karşılık gelen Transact-SQL deyimi derlendiğinde geçerli olan bağlam veritabanının kimliği. Geçici ve hazırlanmış SQL deyimleri için, deyimlerin derlendiği veritabanının kimliği.

Sütun null atanabilir.
Nesne Kimliği int Bu sorgu planı için nesnenin kimliği (örneğin saklı yordam veya kullanıcı tanımlı işlev). Geçici ve hazırlanmış toplu işlemler için bu sütun null olur.

Sütun null atanabilir.
sayı smallint Numaralandırılmış saklı yordam tamsayısı. Örneğin, emirler uygulaması için bir prosedür grubu orderproc olarak adlandırılabilir; 1, orderproc; 2 ve benzeri. Geçici ve hazırlanmış toplu işlemler için bu sütun null olur.

Sütun null atanabilir.
şifrelenmiş bit Karşılık gelen saklı yordamın şifrelenip şifrelenmediğini gösterir.

0 = şifrelenmemiş

1 = şifrelenmiş

Sütun geçersiz değildir.
query_plan xml plan_handle ile belirtilen sorgu yürütme planının derleme zamanı Showplan temsilini içerir. Showplan XML biçimindedir. Geçici Transact-SQL deyimleri, saklı yordam çağrıları ve kullanıcı tanımlı işlev çağrıları gibi her toplu işlem için bir plan oluşturulur.

Sütun null atanabilir.

Açıklamalar

Aşağıdaki koşullar altında, sys.dm_exec_query_plan için geri dönen tablonun query_plan sütununda Showplan çıktısı döndürülmez:

  • plan_handle kullanılarak belirtilen sorgu planı plan önbelleğinden çıkarıldıysa, geri dönen tablonun query_plan sütunu null olur. Örneğin, bu durum plan kolunun ele geçirildiği ile sys.dm_exec_query_plan ile kullanıldığı zaman arasında bir gecikme olduğunda ortaya çıkabilir.

  • Bazı Transact-SQL ifadeleri, örneğin toplu işlem ifadeleri veya 8 KB'dan büyük dize literalleri içeren ifadeler önbelleğe alınmaz. Bu tür ifadeler için XML Showplanları, sys.dm_exec_query_plan kullanılarak alınamaz, ancak toplu grup şu anda yürütüyor çünkü önbellekte bulunmuyorlar.

  • Eğer Transact-SQL bir toplu veya saklanan prosedür, örneğin EXEC (dizimiz) kullanılarak kullanıcı tanımlı bir fonksiyona çağrı veya dinamik SQL'e çağrı içeriyorsa, kullanıcı tanımlı fonksiyon için derlenmiş XML Showplan, sys.dm_exec_query_plan tarafından toplu veya depolanmış prosedür için döndürülen tabloya dahil edilmez. Bunun yerine, kullanıcı tanımlı fonksiyona karşılık gelen plan tutamacı için ayrı bir sys.dm_exec_query_plan çağrısı yapmanız gerekir.

Bir ad hoc sorgu basit veya zorunlu parametreleştirme kullandığında, query_plan sütunu yalnızca ifade metnini içerir ve gerçek sorgu planını içermez. Sorgu planını geri vermek için, hazırlanmış parametreli sorgu için plan tutamacını sys.dm_exec_query_plan arayın. Sorgu parametrelendirilip parametrelenmediğini sys.syscacheobjects görünümünün sql sütununa mı yoksa sys.dm_exec_sql_text dinamik yönetim görünümünün metin sütununa da referans vererek belirleyebilirsiniz.

Uyarı

xml veri tipinde izin verilen iç içe seviye sayısındaki sınırlama nedeniyle, sys.dm_exec_query_plan 128 iç içe öğe seviyesini karşılayan veya aşan sorgu planlarını döndüremez. SQL Server'ın önceki sürümlerinde bu koşul sorgu planının döndürülmesini engelledi ve 6335 hatasını oluşturuyordu. SQL Server 2005 (9.x) Service Pack 2 ve sonraki sürümlerde, query_plan sütunu NULL döndürür.
Sorgu planının çıktısını metin formatında döndürmek için sys.dm_exec_text_query_plan (Transact-SQL) dinamik yönetim fonksiyonunu kullanabilirsiniz.

Permissions

sys.dm_exec_query_plan çalıştırmak için bir kullanıcının sistem yöneticisi sabit sunucu rolünün üyesi olması veya sunucuda izne sahip VIEW SERVER STATE olması gerekir.

SQL Server 2022 ve üzeri için izinler

Sunucuda SUNUCU PERFORMANS DURUMUNU GÖRÜNTÜLE izni gerektirir.

Örnekler

Aşağıdaki örnekler, sys.dm_exec_query_plan dinamik yönetim görünümünün nasıl kullanılacağını göstermektedir.

XML Showplans'ı görüntülemek için, SQL Server Management Studio'nun Sorgu Editörü'nde aşağıdaki sorguları çalıştırın, ardından sys.dm_exec_query_plan tarafından döndürülen tablonun query_plan sütununda ShowPlanXML'e tıklayın. XML Showplan, Management Studio özet panelinde görüntülenir. XML Showplan'ı bir dosyaya kaydetmek için, query_plan sütununda ShowPlanXML'e sağ tıklayın, Sonuçları Kaydet'e tıklayın, dosyayı file_name.sqlplan> formatında < adlandırın; örneğin, MyXMLShowplan.sqlplan.

A. Yavaş çalışan Transact-SQL sorgusu veya toplu için önbelleklenmiş sorgu planını alın

Ad hoc gruplar, depolanmış prosedürler ve kullanıcı tanımlı fonksiyonlar gibi çeşitli Transact-SQL grupları türleri için sorgu planları, plan önbelleği adı verilen bir bellek alanında önbelleklenir. Her önbelleğe alınan sorgu planı, plan tutacağı adı verilen benzersiz bir tanımlayıcı ile tanımlanır. Bu plan kolunu belirli bir Transact-SQL sorgusu veya toplu için yürütme planını almak için sys.dm_exec_query_plan dinamik yönetim görünümüyle belirtebilirsiniz.

Eğer bir Transact-SQL sorgusu veya toplu çalışma belirli bir SQL Server bağlantısında uzun süre çalışıyorsa, gecikmenin nedenini bulmak için o sorgu veya toplu çalışma planını alın. Aşağıdaki örnek, yavaş çalışan bir sorgu veya toplu için XML Showplan'ın nasıl alınacağını gösterir.

Uyarı

Bu örneği çalıştırmak için, session_id ve plan_handle değerlerini sunucunuza özgü değerlerle değiştirin.

İlk olarak, sorgu veya toplu işlemi yürüten süreç için oturum kimliğini (SPID) depolanmış prosedür kullanarak sp_who alın:

USE master;  
GO  
exec sp_who;  
GO  

Döndürülen sp_who sonuç kümesi, oturum kimliğinin 54olduğunu gösterir. Dinamik yönetim görünümüyle birlikte oturum kimliğini sys.dm_exec_requests kullanarak plan tutamacını aşağıdaki sorguyu kullanarak alabilirsiniz:

USE master;  
GO  
SELECT * FROM sys.dm_exec_requests  
WHERE session_id = 54;  
GO  

sys.dm_exec_requests tarafından döndürülen tablo, yavaş çalışan sorgu veya toplu 0x06000100A27E7C1FA821B10600için plan tutamacının , olduğunu gösterir; bu argüman olarak XML formatında yürütme planını almak için plan_handle argüman sys.dm_exec_query_plan olarak belirtebilirsiniz. Yavaş çalışan sorgu veya toplu için XML formatında yürütme planı, tablonun query_plan sütununda bulunur ve bu sütun, döndürülür.sys.dm_exec_query_plan

USE master;  
GO  
SELECT * 
FROM sys.dm_exec_query_plan (0x06000100A27E7C1FA821B10600);  
GO  

B. Plan önbelleğinden tüm sorgu planlarını alın

Plan önbelleğinde bulunan tüm sorgu planlarının anlık görüntüsünü almak için, dinamik yönetim görünümünü sys.dm_exec_cached_plans sorgulayarak önbellekteki tüm sorgu planlarının plan tutamaçlarını alın. Plan kolları plan_handle ' sys.dm_exec_cached_plansnin sütununda saklanır. Sonra plan tutamaçlarını sys.dm_exec_query_plan aşağıdaki gibi aktarmak için CROSS APPLY operatörünü kullanın. Şu anda plan önbelleğinde query_plan bulunan her plan için XML Showplan çıktısı, geri gönderilen tablonun sütununda yer alır.

USE master;  
GO  
SELECT * 
FROM sys.dm_exec_cached_plans AS cp 
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle);  
GO  

C. Sunucunun plan önbelleğinden bilgi topladığı tüm sorgu planlarını alın

Sunucunun şu anda plan önbelleğinde bulunan istatistikleri topladığı tüm sorgu planlarının anlık görüntüsünü almak için, dinamik yönetim görünümünü sys.dm_exec_query_stats sorgulayarak bu planların plan tutamaçlarını önbellekte alın. Plan kolları plan_handle ' sys.dm_exec_query_statsnin sütununda saklanır. Sonra plan tutamaçlarını sys.dm_exec_query_plan aşağıdaki gibi aktarmak için CROSS APPLY operatörünü kullanın. Sunucunun şu anda plan önbelleğinde query_plan istatistikleri topladığı her plan için XML Showplan çıktısı, geri gönderilen tablonun sütununda yer alır.

USE master;  
GO  
SELECT * 
FROM sys.dm_exec_query_stats AS qs 
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle);  
GO  

D. Ortalama CPU süresine göre en iyi beş sorgu hakkında bilgi alın

Aşağıdaki örnek, ilk beş sorgu için planları ve ortalama CPU süresini geri getirmektedir.

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_query_plan(qs.plan_handle)  
ORDER BY total_worker_time/execution_count DESC;  
GO  

Ayrıca Bkz.

Dinamik Yönetim Görünümleri ve İşlevleri (Transact-SQL)
sys.dm_exec_cached_plans (Transact-SQL)
sys.dm_exec_query_stats (Transact-SQL)
sys.dm_exec_requests (Transact-SQL)
sp_who (Transact-SQL)
Showplan Mantıksal ve Fiziksel İşleçler Referansı
sys.dm_exec_text_query_plan (Transact-SQL)