SQL Server Performans Problemleri

17 Şubat 2019 Pazar

SQL Server’da  en korkulan performans problemleridir. SQL Server performansı denildiğinde ilk akla gelen şey, CPU ve Memory upgrade’nin yapılmasıdır. Genelde yazılım departmanları, SQL Server’a daha fazla CPU ve daha fazla memory verilmesini sistem ekiplerinden isterler. CPU ve memory ilave yapılan SQL Server’lar ilk başta biraz daha iyi gibi çalıştığı görülse de, aslında arka planda değişen hiçbir şey olmamıştır.

Bir SQL klasiği olan CPU ve memory arttırmak yerine, gerçekte SQL Server’ın performansını etkileyen unsurları incelemekte fayda var. İlk olarak SQL Server’a fazlasıyla donanım kaynağı (CPU, Ram) verdiniz, işletim sistemdeki performans ayalarını optimize ettiniz ve son olarak SQL Server’daki temel ayarları yaptığınız diyelim, bundan sonra performans için aşağıdakileri de incelememiz gerekir.

Hatalı indeksleme Problemi: SQL Server’ın en büyük performans problemlerinden biri, yetersiz ve hatalı indekslemedir. Bir sorgudaki indeksleme doğru yapılmadığında, SQL Server bu sorguyu çalıştırmak için, daha fazla data işlemek zorunda kalacak ve bu gereksiz yapılan işlemler, SQL Server’ın kurulu olduğu sunucu üzerinde, gereksiz şekilde CPU ve RAM tüketecektir.

CPU ve RAM’in gereksiz yere kullanılması ile birlikte, sorguların çalışma süreleri de paralel bir şekilde olumsuz etkilenecek, süreleri uzayan sorgular da, blockinglere ve deadlock’lara sebebiyet verecektir.

Blocking ve Deadlock’ların Çok Fazla Oluşması: Bir satırdaki veriyi, aynı anda güncellemek istediğinizde SQL Server buna izin vermez. Veri bütünlüğünü sağlamak için blocking mekanizmasını devreye sokar. Bu mekanizma veri sağlığı için gayet başarılı bir kurgudur. Fakat blockinglerin sürekli ve sık sık yaşanması, SQL Server’da yavaşlıklara neden olmaktadır. Sürekli yaşanan blockingler, bir sorun olduğunun göstergesidir. Deadlock’lar, ortak bir kaynağa erişmeye çalışan iki prosesin birbirini kilitlemesi ile başlayan, ardından query engine’nin en az maliyetli olan prosesi kill etmesiyle yani durdurmasıyla son bulan bir operasyondur. Bu kill edilen prosese deadlock victim denir.

Deadlockların genel olarak bir SQL Server temel sorunu olarak görülür. Veri bütünlüğü bir sorgunun çalışma zamanı; blocking ve deadlocklardan olumsuz bir şekilde etkilenebilir.

Hatalı İstatistikler (Statistics): SQL Server’ın performans hesaplama temelleri, maliyet bazlı optimizasyona dayanır. Verinin kullanımda en çok ihtiyaç duyulan indekslerdir. İndekslerin de etkili bir şekilde kullanılmasında da statisticslerin doğru yapılandırılması çok önemlidir.

Doğru statisticsler olmadığında, SQL Server sorgulardaki satır sayısı tahminlemesin de yanlış yapabilir. Satır sayısını tahminlemenin sorgu performansına etkisi ise, örnek olarak 10bin satır gelecek olan bir sorgunun, estimated row number değeri 1milyon olarak tahminlendiğin de, gereksiz yere IO kullanımı ortaya çıkacak ve sorgu sonucu uzun süren bir işleme girebilir.

Uygun Olmayan Sorgu Tasarımı: İndekslerin etkin bir biçimde kullanılması, SQL sorgularının yazım biçimiyle ilişkili bir yapısı vardır. Bir tabloda çok sayıda satırın döndüğü bir sonuç kümesini olması veya bir tablodan daha büyük bir sonuç döndüren bir filtre kriterini belirtilmesi durumlarında kullanılan indekslerde etkisiz kalabilmektedir.

Maliyet yani cost değerlerine dikkat edilmeden yazılan SQL sorguları, optimizer’ın uygun indeksleri seçmesini engellemektedir, bunun sonucunda da sorgu çalışma zamanlarının uzaması ve blockinglerin artmasına sebep olabilir.

Doğru Set Edilmemiş SQL Operatörleri: Transact SQL dili veri kümeleri üzerinde çalışan bir sorgulama dilidir. Bunun anlamı, satır olarak düşündüğünüz bir yazılım dilinin, kolonlar bazında yani veri alanları açısından düşünmeniz gerektiğidir. T-SQL kodlarını yazarken de, düz yazı gibi yazmak yerine kümelenmiş verilerin kolonlar bazında sorgulanmasını düşünerek olur.

Cursor kullanımları ve gereksiz döngüler kullanıldığında, subquery’lerde ve join’lerdeki döngüyü gözden kaçırmanıza neden olabilir. Özellikle cursor kullanımı için performans killer tabirini kullanmak yerinde olur. Cursor yerine while operatörünü kullanmak ve sorgularınızı while döngüsü ile optimize edilmesi daha iyi olacaktır.

Sıkça yapılan SELECT * kullanımları da gereksiz IO tüketimlerine sebep olacaktır, * yerine ne kadar alan sorgulanmak isteniyor ise bu alanların isimleri üşenmeden yazılmalıdır.

Uygun Olmayan Veritabanı Tasarımı: Veritabanı tasarımları genellikle yazılımı yazanlar tarafından veya yazılım yazımında kullanılan hazır frameworkler tarafından otomatik olarak yapılıyor. Özellikle hızlı ve pratik kod yazmak için, son zamanlarda bu tarz yapıların kullanımı artmaktadır.

Veritabanı tasarlarken ilk dikkat edilmesi gereken nokta, veri işleme manipülasyon ve blockinglerin olmaması için, tablo tasarımlarının optimize şekilde olması gerekiyor.

Optimize bir veritabanı nasıl tasarlanmalı konusu için, bir örnek üzerinden gidelim. Müşteri adresi ve müşteri kart bilgileri bizim verilerimiz olsun. İşin kolayına kaçarak, müşteri adresi ve müşteri kart bilgileri tek tablo üzerinde tutarsanız eğer, verileriniz büyüdükçe, bir müşteri adresini ararken aynı zamanda gereksiz olarak müşteri kart bilgileri içinde kaynak harcayacaksınız. Her veriyi tek tablo üzerinde tuttuğunuz da ise zamanla blockingler çoğalacak ve veritabanınız içinden çıkılmayacak bir hale dönüşecektir.


Share/Bookmark

0 comments :