10/15/2005

Database Performans ve Tuning Islemleri

Bu ara optimizasyon konusunda destek verdiğim 3 milyon satırlık SQL Server database tablosu içeren bir proje ile ilgili tecrübelerimi paylaşıym biraz...

Öncelikle, herhangi bir SQL Server 2000 database üzerinde purge(temizlik) işlemleri yaptiktan sonra veritabanınızın eski performansında çalışmasını istiyorsanız ve veritabanınız üzerindeki tablolarda indexleriniz bulunuyorsa öncelikle takip etmeniz adımlar;

1- Database indexlerinizi yeniden yaratın (DBCC REINDEX komutu ile)

2- DBCC CONTIG komutu ile index ve tablo fragmantasyonu (bölünmesi) olup olmadığını mutlaka kontrol edin.

DBCC SHOWCONTIG Kullanımı:
En basit kullanım şekli query analyzerda aşsağıdaki gibidir;(Daha fazlası için SQL Server Query Analyzerdan Online Books bölümüne bakın)

DBCC SHOWCONTIG (TabloAdı)

Bu komut size liste halinde birçok veri geri verecektir. Şimdi bu komutun bize geri vereceği bilgilerin ne anlama geldiğine bakalım.

Pages Scanned: (Taranılmış Sayfa Sayısı) Eğer veritabanınızda yaklasik olarak ne kadar satır bulunduğunu biliyorsanız, bu bölümde size ne kadar page(sayfa) verileceğini tahmin etmeniz mümkün.

Extents Scanned: Tranılmış sayfa sayınızı alıp 8 e böldüğünüzde, elinize geçen rakamı en yakın rakama yuvarlayın ve Extents Scanned bölümünde elinize geçmesi gereken rakamı bulmuş olacaksınız. Eğer DBCC SHOWCONTIG tarafından size verilen rakam sizin hesapladığınızdan yüksek çıkıyorsa database/tablonuzda fragmentation(bölünme) var demektir. Aradaki fark çok büyükse, mutlaka makalenin sonundaki açıklayacağım adımları uygulayın.

Extent Switches: Bu rakam Extents Scanned bölümdeki rakamdan 1 rakam küçük olmalıdır. Rakamlar arasındaki yüksek fark, database/tablonuzda bir veri fragmantasyonu olduğunu gösterir.

Avg Pages per Extent: Pages Scanned / Extents Scanned e eşittir ve doğal olarak 8'e eşit olmalıdır. 8'den küçük rakamlar database/tablo fragmantasyonu olduğunu gösterir.

Scan Density: (En önemli bölümlerden biri) Bu bölümde DBCC CONTIG tarafından size gösterilen deger, yüzde 100'e olabildiğince yakın olmalıdır. Düşük değerler veritabanınızın/tablonun fragmantasyona uğradığını gösterir.

Logical Scan Fragmentation: Veritabanınızdaki olması gerektiği yerde bulunmayan page'lerin oranını gösterir.Yüzde 0 ile yüzde 10 arasında olmalıdır. Yüzde 10'un üzerinde ise, veritabanınız/tablonuz fragmentation'a uğramış demektir.

Extent Scan Fragmentation: Veritabanınızdaki alanlar arasındaki boşlukların yüzdesini gösterir. Yüzdelik değer 0 olmalıdır. Daha yüksek yüzde değerleri, databaseinizin/tablonuzun fragmentation'a uğradığını gösterir.

Avg. Bytes Free per Page: Sayfalardaki ortalama boş alanı gösterir. Yüksek rakamlar database'inizin/tablonuzun fragmantasyona uğradığını gösterir.

Avg Page Density: 1/Avg Bytes Free Per page . Yukarıdaki değerin yüzdelik şekilde belirtilmiş halidir. Düşük yüzdeler database/tablonun fragmentasyonuna işarettir.

Database Fragmentation (Bölünmeleri) İçin Çözümler
1. Indexlerinizi Drop ederek tekrar yaratabilirsiniz.2. İndexlerinizi Recreate komutunun DROP EXISTING özelliğini kullanarak tekrar yaratabilirsiniz.3. DBCC DBREINDEX komutunu kullanabilirsiniz.4. DBCC INDEXDEFRAG komutunu kullanarak indexlerinizi defragment(birleştirmek) edebilirsiniz.

Eğer veritabanınız üzerinde o sırada işlemler yapılıyorsa, indexi drop etme(atma) opsiyonunu seçerseniz yeni indexi çok çabuk şekilde yaratmalısınız yoksa veritabanınız indexsiz şekilde çok verimsiz çalışabilir.

DBCC DBREINDEX komutu çalışırken durdurulduğu takdirde, bütün defragmentasyon kaybedilir ve yeniden defragment komunutunu çalıştırmanız gerekir.

DBCC INDEXDEFRAG komutu, veritabanınız üzerinde en az yükü yaratacak opsiyondur. O anda gerçekleşen SELECT tarzı indexi kullanan komutlarla herhangi bir çakışmaya sebep olmaz. Ancak sonuçları yeni bir index oluşturmak kadar verimli olmayabilir. Çünkü bu komut indexleri düzene sokmak için diğer yukarıdaki methodlar gibi yeni sayfalar yaratmaz.