Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Microsoft Fabric'te SQL veritabanı
Bir Transact-SQL partisi veya toplu bir ifade için Showplan'ı metin formatında döndürür. Plan kolu tarafından belirtilen sorgu planı ya önbelleklenebilir ya da şu anda çalıştırılabilir. Bu tablo değerli fonksiyon sys.dm_exec_query_plan (Transact-SQL) ile benzer, ancak aşağıdaki farklara sahiptir:
- Sorgu planının çıktısı metin formatında döner.
- Sorgu planının çıktısı boyut olarak sınırlı değildir.
- Parti içindeki bireysel ifadeler belirtilebilir.
Şunlara uygulanır: SQL Server (SQL Server 2008 (10.0.x) ve sonrası), Azure SQL Database.
Transact-SQL söz dizimi kuralları
Sözdizimi
sys.dm_exec_text_query_plan
(
plan_handle
, { statement_start_offset | 0 | DEFAULT }
, { statement_end_offset | -1 | DEFAULT }
)
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:
statement_start_offset | 0 | TEMERRÜT
Bayt cinsinden, satırın sorgusunun metinde veya kalıcı nesnenin metninde tanımladığı başlangıç konumunu gösterir.
statement_start_offsetiçsel. 0 değeri, partinin başlangıcını gösterir. Varsayılan değer 0'dır.
Başlangıç ofseti aşağıdaki dinamik yönetim nesnelerinden elde edilebilir:
statement_end_offset | -1 | TEMERRÜT
Baytlar cinsinden, satırın sorgu için tanımlandığı son konumu kendi partisinin veya kalıcı nesnenin metninde belirtir.
statement_start_offsetiçsel.
-1 değeri partinin sonunu gösterir. Varsayılan değer -1'dir.
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 | nvarchar(max) |
plan_handle ile belirtilen sorgu yürütme planının derleme zamanı Showplan temsilini içerir. Showplan metin formatındadır. 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_text_query_plan için geri dönen tablonun 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, plan tutamacının ele geçirildiği ile sys.dm_exec_text_query_plan ile kullanıldığı zaman arasında bir zaman gecikmesi olduğunda bu durum 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 gösteri planları, önbellekte bulunmadıkları için sys.dm_exec_text_query_plan kullanılarak alınamaz.
Eğer Transact-SQL bir toplu veya depolanmış prosedür, örneğin EXEC (dizeni) 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_text_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_handleiçin ayrı bir sys.dm_exec_text_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 handle sys.dm_exec_text_query_plan'yi 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.
Permissions
sys.dm_exec_text_query_plan çalıştırmak için, bir kullanıcının sistem sistem yöneticisi sabit sunucu rolünün üyesi olması veya sunucuda VIEW SERVER STATE iznine sahip olması gerekir.
SQL Server 2022 ve üzeri için izinler
Sunucuda SUNUCU PERFORMANS DURUMUNU GÖRÜNTÜLE izni gerektirir.
Örnekler
A. Yavaş çalışan Transact-SQL sorgu veya toplu için önbelleklenmiş sorgu planını almak
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 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 için plan tutamacının olduğunu 0x06000100A27E7C1FA821B10600gösterir. Aşağıdaki örnek, belirtilen plan kolu için sorgu planını döndürür ve sorgu veya toplu tüm ifadeleri döndürmek için varsayılan değerler 0 ve -1 kullanır.
USE master;
GO
SELECT query_plan
FROM sys.dm_exec_text_query_plan (0x06000100A27E7C1FA821B10600,0,-1);
GO
B. Plan önbelleğinden tüm sorgu planlarını geri almak
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_text_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 Showplan çıktısı, geri dönen tablonun sütununda yer alır.
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. Sunucunun plan önbelleğinden sorgu istatistiklerini topladığı her sorgu planını almak
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_text_query_plan aşağıdaki gibi aktarmak için CROSS APPLY operatörünü kullanın. Her plan query_plan için Showplan çıktısı, geri dönen tablonun sütununda yer alır.
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. Ortalama CPU süresine göre en iyi beş sorgu hakkında bilgi almak
Aşağıdaki örnek, ilk beş sorgu için sorgu planlarını ve ortalama CPU süresini geri getirir. sys.dm_exec_text_query_plan fonksiyonu, sorgu planındaki tüm ifadeleri döndürmek için varsayılan değerler 0 ve -1 belirtir.
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