Bu yazıda yazdığımız SQL sorgularının performansını nasıl kontrol edebileceğimizi anlatacağız. Performans dediğimizde aklımıza hız gelir. Bu nedenle hemen herkes yazdığı sorgunun çalışma süresini kıyaslayıp performanslı olup olmadığı karar vermeye çalışır. Oysaki süre çalıştığınız ortamların özelliklerinden etkilenir. Serverın CPU, Memory özellikleri, çalıştığınız bilgisayarın donanımsal özellikleri hatta aradaki network bile süreye etki etmektedir. Yazılım geliştirme ortamları ile üretim ortamları birbirinden çok farklı olmasından dolayı süre kıyaslamaları performans testleri için doğru bilgi vermez. Bu anlattıklarımızı demo ile gösterelim.
Sorgumuz 1796 ms. sürdü. Aynı sorguyu tekrar çalıştıracağız.
Sorgu aynı olmasına rağmen ikinci kez çalıştırdığımda 1 .21 0 ms. sürdü. Hiç bir değişiklik
yapılmamasına rağmen ikinci kez çalıştırdığımızda daha hızlı sonuç getirdi. Sizin de ilk
çalıştırdığınızda yavaş, sonrakilerde hızlı çalışan sorgularınız olmuştur. Bu fark neden
kaynaklanmaktadır?
Cevabı çok basit; ilk çalıştırdığımızda veriler diskte duruyordu. SQL server verileri diskten
okuyup önce server memorisine taşıdı sonra sonucu getirdi. Sonraki çalıştırmada ise doğrudan memoriden okuyup sonucu getirdi.
Bu nedenlerden dolayı SQL sorguları performansı kıyaslamak için süreye(Duration) değil,
sorgunun okuma(read) yaparken ne kadar IO yaptığına bakacağız. Sorgu ve tablolardaki kayıt sayıları aynı kalmak şartıyla, IO ortamlardan bağımsızdır ve her koşulda aynı sonucu verir.
IO İstatistik Bilgilerinin Gösterilmesi
IO miktarını görmek için sorgumuzdan önce aşağıdaki SQL komutunu çalıştırıyoruz.set statistics io on
Aynı sorguyu tekrar pes peşine 2 kez çalıştırdım. Süreler daha öncekilere yakın değerlerde;
1733 ms. ve 1273 ms. olarak gerçekleşti. Sorgu sonucunda yapılan IO miktarlarını da
görebiliyoruz. Bizim için önemli olan yer “logical reads” yani memoriden okumaları gösteren kısımdır. Her iki sorguda da 32.980 olarak görünüyor. İlk sorguda “physical reads” ve “readahead reads” değerleri de var. Bunlar yukarıda bahsettiğim gibi diskten okumaları
göstermektedir.
Peki, 32980 neyi ifade eder? Okunan page miktarıdır ve aslında bu OLTP sistemler için yüksek
bir değerdir.
3 numaralı sorguda tablodaki kayıt sayıları bulurken bile daha az IO yapıldığı görülmektedir.
Tablonun tamamının okunması ise yalnızca 3 kat fazla IO ya neden olmaktadır.
Eğer sorgumuz düzgün olarak index kullanılıyor olsa aşağıdaki gibi tek haneli veya 3 haneli IO
miktarları görmemiz beklenir
Yalnızca 3 adet IO ile sorgu sonucunu getirmektedir.
Serverın Harcadığı Süre ve CPU Kullanımının Gösterilmesi
IO ile birlikte SQL server işlemi yapabilmek için CPU da tüketir. Ne kadar CPU kullandığıaşağıdaki komut ile görebiliriz.
set statistics time on
Bu sorguyu çalıştırırken CPU süresi 1203 ms. olmuştur. Core sayısı yüksek olan serverlarda
paralel execution yapılabilmesi durumunda “CPU time” ile “Elapsed time” arasında belirgin
farklar olmaktadır. Buradaki sorgumuz basit olmasından dolayı iki değer birbirine çok yakın
olmuştur.
Hiç yorum yok:
Yorum Gönder