Saklı İşlemlerin Profili Nasıl Yapılır?


26

SQL Server 2012 kullanıyorum ve saklı yordamları nasıl profilleyeceğimi merak ediyorum

Örneğin, profiler her bir SQL deyimini saklı bir prosedürde, ne olduğu ve ne kadar süre çalışması vb. Yakalayabilir?

Birleştirme çoğaltması saklı yordamları tanılamaya çalışıyorum ve bu birleştirme aracı tam bir çalışmasının bir parçası yakalanması gerekir. Saklı yordamın performans sorunları ile kapmak ve yeniden çalıştırmak mümkün görünmüyor, çünkü bu noktada yavaş değildir.

Yanıtlar:


27

Kevin'in cevabı, SQL Trace / SQL Profiler'da hangi olayların yakalanacağını açıklar. Bu cevabı biraz genişletmek için - SP:StmtCompletedseslendirildiği gibi tamamlanmış olan bir saklı yordamdaki her bir ifadeyi gösterecektir.

Ayrıca, yoğun bir sistemdeyseniz ve bir performans sorununu teşhis etmeye çalışıyorsanız, SQL Profiler konusunda dikkatli olmalısınız. SQL Profiler, dosya izlemekten veya Extended Events kullanmaktan daha yavaştır. Jonathan Kehayias tarafından yazılan bu blog yazısı , bir sistemin SQL Profiler'ın kullanılmasından yaklaşık % 90'ı ve izlemeden dosyaya% 10'u ek yükü gösteriyor. Genişletilmiş Olaylar için Daha Az. Bu nedenle genellikle SQL Profiler'ın kendisini çalıştırmaması önerilir.

Bu bilgiler Genişletilmiş Olaylar aracılığıyla edinilebilir olsa da, hala SQL Trace (SQL Profiler'ın arkasındaki teknoloji) kullanmanızı öneririm, bunun yerine bir dosyaya kadar izlemenizi öneririm.(Eğer Genişletilmiş Olayları öğrenme ve kullanma konusunda yatırım yapmak istiyorsanız, bu yolun yoludur, gelecekteki bir SQL Server SQL Trace sürümünde gitmiş olacak ve tüm sahip olacağımız Genişletilmiş Olaylar olacaktır). Ayrıca, yalnızca gerekli olanı yakaladığınızdan emin olmak için Sütun Filtreleri düğmesinden mümkün olduğunca arka plan gürültüsünü filtrelemenizi öneririm. İzerinizi Profiler aracıyla Kevin'in iyi cevabında açıklanan adımları kullanarak ayarlayabilir ve ardından aynı GUI'den bir filtre ekleyebilirsiniz. Sonra izlemeyi bir komut dosyası olarak dışa aktarabilir ve bu komut dosyasını SQL Server'da izleyerek veritabanı veya işlem günlüğü dosyaları içermeyen bir klasördeki bir dosyaya çalıştırabilirsiniz. Dışa aktarmak için, izinizi kolayca kurar, istediğiniz şeyi aldığınızdan emin olmak için birkaç saniye çalıştırın, durdurun ve ardından menü çubuğuna gidin ve File->Export-> Script Trace Definitionve dosyayı kaydedin. Ardından, izlemeyi düşündüğünüz sunucudaki yeni bir sorgu penceresinde bu dosyayı açın. Oluşturduğunuz bu betiğin seçenekleri ve tanımları hakkında daha fazla bilgiyi, buradan başlayarak oluşturduğunuz o betişte kullanılan çeşitli saklı yordamlar için yardım makalelerine bakarak görebilirsiniz .

Vaktiniz varsa ve öğrenmek istiyorsanız, Genişletilmiş Etkinlikler hakkındaki bazı makaleleri okuyabilir ve bilgileri nasıl yakalayacağınızı görebilirsiniz. Jonathan Kehayias , buradan başlamaya hazır olduğunuzda blog gönderileri için harika bir kaynaktır.


2
Ne zaman bir SP: StmtCompleted sorgu metninde "- Şifreli metin" gösterdiğinde? Hangi tablolara erişildiğini nasıl öğrenebiliriz?
Brain2000

Brain2000'de seninle aynı problemi yaşamak ....
wenzzzel

21

Bireysel ifadeleri saklı bir prosedürde SQL Server Profiler aracılığıyla yakalayabilirsiniz. Bunu yapmak için, Etkinlikler Seçimi sekmenizde "Tüm etkinlikleri göster" onay kutusunu tıklayın. Ardından, Kayıtlı İşlemler kategorisine gidin ve SP: StmtCompleted öğesinin yanındaki kutuyu işaretleyin . Ayrıca, SQL: BatchStarted ve SQL: BatchCompleted olaylarını seçtiyseniz, tümünü SPID ile birbirine bağlayarak, saklı bir prosedürün baştan sona bir resmini alabilirsiniz.

Ayrıca yavaş yavaş uygulayan yordamınız için bir sorgu planı alıp alamayacağınızı görmek için plan önbelleğine de bakmanıza yardımcı olabilir. Böyle bir şeyle başlayabilirsin:

SELECT 
    OBJECT_NAME(st.objectid,st.dbid) AS ObjectName,
    cp.usecounts AS ExecutionCount,
    st.TEXT AS QueryText,
    qp.query_plan AS QueryPlan
FROM 
    sys.dm_exec_cached_plans AS cp
    CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
    CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
WHERE 
    cp.objtype = 'Proc'
    AND OBJECT_NAME(st.objectid,st.dbid) = 'YourStoredProcedure';
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.