SQL Server Profiler ile yaptığımız tuning işlemini sorgular ile yapmaya çalışacağız.
Bu işlem için iki stored procedure yazdık.
- Birincisi aktif olan traceleri durdurup veritabanından ve diskten temizliyor.
- İkincisi Yeni bir trace açıp belirli bir dosya boyutunda ve süresince veritabanında trace başlatıyor.
Sorgu 1
Aşağıdaki sp ile çalıştırdığımız traceleri temizleyin. Aktif trace bulamaz ise işlem yapmaz:exec clearTraces
Sorgu 2
Bu sorgu ile yeni bir trace başlatıyoruz.- İlk parametre olarak trace dosyası ismi veriyoruz. Bu dosyanın sonuna diskte trc uzantısı ile bir dosya oluşturur. Daha Önce aynı isimde dosya var ise hata verir. Sorgu 1 çalıştı ise hata ile karşılaşmazsınız.
- İkinci parametre mb cinsinden dosya büyüklüğünü gösteriyor.
- Ücüncü parametre ile trace'in kaç dakika süreceğini belirliyoruz.
exec dbo.StartTrace
'c:\temp\Ogr001'--trace dosya adı.
,1000--mb
,10--dakika
Sorgu 3
Aşağıdaki sorgu ile trace dosyasındaki verileri bir temp tabloya atıyor. Burada temp tabloya atarken where koşulundaki hostname ve Databese name gibi parametreleri düzenleyebilirsiniz.Sorgunun ikinci kısmında from ve where koşulları arasına göre sorguları grupluyor. Böylece parametreleri kaldırarak tabloya kaçkere sorgu attığını görebiliyoruz.
İlk Kısım
declare @traceFile varchar(216)
set @traceFile='c:\temp\Ogr001.trc'
SELECT * into #sorgular
FROM fn_trace_gettable(@tracefile ,1)
where DatabaseName like '%DB%'
and ApplicationName='.Net SqlClient Data Provider'
and HostName='HOSTNAME-01'
and CAST(TextData as varchar(max))<>'exec sp_reset_connection '
İkinci Kısım
SELECT
SUBSTRING(cast(TextData as varchar(max)), CHARINDEX('FROM',cast(TextData as varchar(max))),
CASE WHEN CHARINDEX('WHERE',cast(TextData as varchar(max)))-CHARINDEX('FROM',cast(TextData as varchar(max))) <=0 THEN 10000 ELSE
CHARINDEX('WHERE',cast(TextData as varchar(max)))-CHARINDEX('FROM',cast(TextData as varchar(max)))end
)
,COUNT(*)
FROM #sorgular
GROUP BY SUBSTRING(cast(TextData as varchar(max)), CHARINDEX('FROM',cast(TextData as varchar(max))),
CASE WHEN CHARINDEX('WHERE',cast(TextData as varchar(max)))-CHARINDEX('FROM',cast(TextData as varchar(max))) <=0 THEN 10000 ELSE
CHARINDEX('WHERE',cast(TextData as varchar(max)))-CHARINDEX('FROM',cast(TextData as varchar(max)))end
)
ORDER BY 2 desc