Aracılığıyla paylaş


sys.dm_exec_cached_plans (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnalytics Platform Sistemi (PDW)Microsoft Fabric SQL veritabanı

Her sorgu planı için SQL Server tarafından önbelleğe alınan bir satır döndürür, böylece sorgu daha hızlı yürütülür. Bu dinamik yönetim görünümünü kullanarak önbellekli sorgu planlarını, önbelleklenmiş sorgu metnini, önbellekli planların aldığı bellek miktarını ve önbelleğe alınan planların yeniden kullanım sayısını bulabilirsiniz.

Azure SQL Veritabanı'nda dinamik yönetim görünümleri, veritabanının kapsamasını etkileyecek bilgileri veya kullanıcının erişimi olan diğer veritabanları hakkındaki bilgileri kullanıma sunmaz. Bu bilgilerin açığa çıkmasını önlemek için, bağlı kiracıya ait olmayan verileri içeren her satır filtrelenir. Ayrıca, memory_object_address ve pool_id sütunlarındaki değerler filtrelenir; sütun değeri olarak NULLayarlanır.

Uyarı

Bunu Azure Synapse Analytics veya Analytics Platform Sistemi'nden (PDW) çağırmak için adını sys.dm_pdw_nodes_exec_cached_planskullanın. Bu söz dizimi, Azure Synapse Analytics'teki sunucusuz SQL havuzu tarafından desteklenmez.

Sütun adı Veri türü Description
bucketid int Girişin önbelleğe alındığı hash bucket'in kimliği. Değer, önbellek türü için 0'dan hash tablo boyutuna kadar bir aralık gösterir.

SQL Planları ve Nesne Planları önbellekleri için karma tablo boyutu 32 bit sistemlerde 10.007'ye ve 64 bit sistemlerde 40.009'a kadar olabilir. İlişkili Ağaçlar önbelleği için karma tablo boyutu 32 bit sistemlerde 1.009'a ve 64 bit sistemlerde 4.001'e kadar olabilir. Genişletilmiş Depolanmış Prosedürler önbelleği için 32 bit ve 64 bit sistemlerde hash tablosu boyutu 127'ye kadar olabilir.
refcounts int Bu önbellek nesnesine referans veren önbellek nesnelerinin sayısı. refcounts bir girdinin önbellekte olması için en az 1 olmalıdır.
usecounts int Önbellek nesnesinin kaç kez araştırıldığı. Parametrizlenmiş sorgular önbellekte bir plan bulduğunda artırılmaz. Showplan kullanırken birden fazla kez artırılabiliyor.
size_in_bytes int Önbellek nesnesi tarafından tüketilen bayt sayısı.
memory_object_address varbinary(8) Önbelleğe alınan girişin bellek adresi. Bu değer, önbelleğe alınan planın bellek dağılımını almak için sys.dm_os_memory_objects ile ve girişin önbelleğe alınma maliyetini elde etmek için sys.dm_os_memory_cache_entries ile kullanılabilir_entries kullanılabilir.
cacheobjtype nvarchar(34) Önbellekteki nesne türü. Değer aşağıdakilerden biri olabilir:

Derlenmiş Plan
Derlenmiş Plan Taslağı
Çözümleme Ağacı
Genişletilmiş İşlem
CLR Derlenmiş Func
CLR Derlenmiş İşlem
objtype nvarchar(16) Nesne türü. Aşağıda olası değerler ve bunlara karşılık gelen açıklamalar yer almaktadır.

Proc: Saklanan prosedür
Hazırlanmış: Hazırlanmış açıklama
Geçici: Geçici sorgu. Uzak prosedür çağrıları yerine osql veya sqlcmd kullanılarak gönderilen Transact-SQL dil olaylarını ifade eder.
ReplProc: Replikasyon-filtre-prosedürü
Tetikleyici: Tetikleyici
Görünüm: Görüntü
Varsayılan: Varsayılan
UsrTab: Kullanıcı tablosu
SysTab: Sistem tablosu
Kontrol: Kısıtlama KONTROLÜ
Kural: Rule
plan_handle varbinary(64) Bellek içindeki planın tanımlayıcısı. Bu tanımlayıcı geçicidir ve yalnızca plan önbellekte kalırken sabit kalır. Bu değer aşağıdaki dinamik yönetim işlevleriyle kullanılabilir:

sys.dm_exec_sql_text
sys.dm_exec_query_plan
sys.dm_exec_plan_attributes
pool_id int Bu plan bellek kullanımının hesaba alındığı kaynak havuzunun kimliği.
pdw_node_id int Bu dağıtımın üzerinde olduğu düğümün tanımlayıcısı.

için geçerlidir: Azure Synapse Analytics, Analiz Platformu Sistemi (PDW)

Permissions

SQL Server 2019 (15.x) ve önceki sürümler için izin gerekir VIEW SERVER STATE .

SQL Server 2022 (16.x) ve sonraki sürümleri ve Azure SQL Yönetilen Örneği için izin gerekir VIEW SERVER PERFORMANCE STATE .

Azure SQL Veritabanı Temel, S0 ve S1 hizmet hedeflerinde ve elastik havuzlardaki veritabanları için sunucu yönetici hesabı, Microsoft Entra yönetici hesabı veya ##MS_ServerStateReader## üyeliği gereklidir. Diğer tüm SQL Veritabanı hizmet hedeflerinde, veritabanında VIEW DATABASE STATE izni veya ##MS_ServerStateReader## sunucu rolü üyeliği gereklidir.

Örnekler

A. Yeniden kullanılan önbelleğe alınmış girdilerin toplu iş metnini döndürme

Aşağıdaki örnek, birden fazla kez kullanılan önbelleğe alınmış tüm girişlerin SQL metnini döndürür.

SELECT usecounts,
       cacheobjtype,
       objtype,
       text
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
WHERE usecounts > 1
ORDER BY usecounts DESC;

B. Önbelleğe alınan tüm tetikleyiciler için sorgu planlarını döndürme

Aşağıdaki örnek, önbelleklenmiş tüm tetikleyicilerin sorgu planlarını döndürür.

SELECT plan_handle,
       query_plan,
       objtype
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
WHERE objtype = 'Trigger';

C. Planın derlendiği SET seçeneklerini döndürme

Aşağıdaki örnek, planın derlendiği seçenekleri döndürür SET . sql_handle Planın geri dönüşü de vardır. PIVOT işleci, ve sql_handle özniteliklerini satır olarak değil sütun olarak çıkarmak set_options için kullanılır. içinde set_optionsdöndürülen değer hakkında daha fazla bilgi için bkz. sys.dm_exec_plan_attributes.

SELECT plan_handle,
       pvt.set_options,
       pvt.sql_handle
FROM (
    SELECT plan_handle,
           epa.attribute,
           epa.value
    FROM sys.dm_exec_cached_plans
        OUTER APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa
    WHERE cacheobjtype = 'Compiled Plan'
) AS ecpa
PIVOT (MAX (ecpa.value) FOR ecpa.attribute IN ("set_options", "sql_handle")) AS pvt;

D. Önbelleğe alınmış tüm derlenmiş planların bellek dökümünü döndürme

Aşağıdaki örnek, önbellekteki tüm derlenmiş planların kullandığı belleğin bir dağılımı geri getirir.

SELECT plan_handle,
       ecp.memory_object_address AS CompiledPlan_MemoryObject,
       omo.memory_object_address,
       type,
       page_size_in_bytes
FROM sys.dm_exec_cached_plans AS ecp
     INNER JOIN sys.dm_os_memory_objects AS omo
        ON ecp.memory_object_address = omo.memory_object_address
        OR ecp.memory_object_address = omo.parent_address
WHERE cacheobjtype = 'Compiled Plan';