26 Şubat 2013 Salı

Sql Serverda TSQL Sorgusu ile Trace Başlatmak


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



Sql Server Stress Analysis



--26.02.2013 

--Just before starting to stress analysis we should delete all statistical records from database. After stress you can use second query to find Recent Expensive Queries.



--Dont run in production environment!
--After running query 1 you should wait 5-10 minute. CPU utilization can be hit 100 percent.

--Query 1:


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS


Sql Server Stres Analizi



--26.02.2013 

--Aşağıdaki sorgu ile stres testi yapmadan önce sql serverdaki istatistikleri sıfırlıyoruz. Stres araçları ile testimizi yaptıktan sonra sistem için problem olan sorguları 2. sorgu ile bulabiliyoruz.



--Production ortamında Çalıştırmayın!
--Bütün istatistikleri sıfırlar!
--Çalıştıktan sonra 5-10 dakika boyunca serverı normal sekilde kullanın sonra stres testine başlayın.
--İşlemci tavana vurabilir.

--Sorgu 1:


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS