
Veritabanınız aylar önce hızlıydı, şimdi aynı sorgular yavaş çalışıyor. Veri miktarı çok artmadı, indeksler yerinde, donanım aynı. Sorun büyümede değil, bakımsızlıkta olabilir.
Bu yazı, veritabanının zamanla neden yavaşladığını ve düzenli bakımı ele alıyor.
Tablo Şişmesi
Silinen veriler diskten hemen kaybolmaz:
- Bir kayıt silindiğinde alan hemen boşalmaz
- Güncelleme işlemi genellikle yeni bir satır yazar
- Eski satır ölü kayıt olarak kalır
- Tablo dosyası büyümeye devam eder
Sonuç şudur: bir tablonun disk boyutu, içindeki gerçek veriden kat kat büyük olabilir — ve her tarama bu ölü alanı da okur.
Bu, özellikle sık güncellenen tablolarda belirginleşir. Oturum tabloları, sayaçlar ve durum alanları bu davranışın en çok etkilediği yapılardır.
Belirtiler
Bakımsız bir veritabanının işaretleri:
- Aynı sorgu zamanla yavaşlıyor. Veri artmasa bile.
- Tablo boyutu veriyle orantısız.
- İndeksler beklenenden büyük.
- Sorgu planı yanlış indeksi seçiyor.
- Yedek dosyası şişiyor.
Dördüncü madde farklı bir soruna işaret eder: veritabanı hangi indeksi kullanacağına istatistiklere bakarak karar verir ve bu istatistikler eskimişse yanlış seçim yapar.
Bu durumda indeks doğru tanımlıdır ama kullanılmaz. Sorgu, indeksi görmezden gelip tüm tabloyu tarar.
İstatistikler
Sorgu planlayıcısının doğru karar vermesi için verinin dağılımını bilmesi gerekir:
| İstatistik | Neyi belirler |
|---|---|
| Satır sayısı | Tarama maliyeti tahmini |
| Değer dağılımı | Kaç satır eşleşecek |
| Benzersizlik oranı | İndeks ne kadar seçici |
| Boş değer oranı | Filtre etkinliği |
İkinci satır en çok fark yaratanıdır: bir sütunda değerlerin çok dengesiz dağıldığı durumlarda, güncel istatistik olmadan planlayıcı tamamen yanlış tahmin yapar.
Örneğin durum sütununda kayıtların büyük çoğunluğu aynı değere sahipse, o değeri arayan bir sorgu için indeks kullanmak anlamsızdır — ama nadir bir değeri arayan sorgu için çok değerlidir. Planlayıcı bu ayrımı istatistiklerden yapar.
Bakım İşlemleri
Düzenli yapılması gereken işler:
- İstatistikleri güncelleme. Hafif, sık yapılabilir.
- Ölü kayıtları temizleme. Alan geri kazanılır.
- Tabloyu yeniden düzenleme. Ağır, kilit gerektirebilir.
- İndeksleri yeniden oluşturma.
- Eski verileri arşivleme.
Üçüncü madde dikkat gerektirir: tablo yeniden düzenleme işlemi tabloyu kilitleyebilir ve bu süre boyunca uygulamanız o tabloya erişemez.
Büyük tablolarda bu işlem dakikalar veya saatler sürebilir. Bakım penceresi dışında çalıştırmak, planlanmamış bir kesintiye yol açar.
Birinci madde ise en yüksek fayda-maliyet oranına sahiptir. İstatistik güncelleme hızlıdır, kilit gerektirmez ve çoğu yavaşlama sorununu çözer.
Otomatik Bakım
Çoğu veritabanı arka planda otomatik bakım yapar ama ayarları gözden geçirilmelidir:
- Eşik değerleri varsayılan olabilir. Büyük tablolarda geç tetiklenir.
- Yoğun saatlerde çalışabilir.
- Kaynak sınırı düşük olabilir. Yetişemez.
- Bazı tablolar atlanabilir.
Birinci madde büyük tablolarda sorun yaratır: otomatik bakım genellikle tablonun belirli bir yüzdesi değiştiğinde tetiklenir — devasa bir tabloda bu yüzde, milyonlarca satır anlamına gelir.
Bu tablolar için eşiği ayrı ayarlamak veya elle zamanlanmış bakım tanımlamak gerekir.
Neyi İzlemeli?
Bakım ihtiyacını gösteren ölçümler:
| Ölçüm | Uyarı durumu |
|---|---|
| Tablo disk boyutu | Veriyle orantısız büyüme |
| Ölü kayıt oranı | Yüksek oran |
| Son bakım zamanı | Uzun süredir yapılmamış |
| Yavaş sorgu sayısı | Artış eğilimi |
| İndeks kullanım oranı | Hiç kullanılmayan indeksler |
Son satır ters yönde bir kazanç sağlar: hiç kullanılmayan bir indeks yalnızca yer kaplamaz, her yazma işlemini de yavaşlatır.
Her ekleme ve güncelleme, tüm indekslerin de güncellenmesini gerektirir. Kullanılmayan indeksleri silmek, yazma performansını doğrudan iyileştirir.
Eski Veriyi Arşivlemek
En kalıcı bakım yöntemi, tabloyu küçük tutmaktır:
- Hangi verinin ne kadar süre gerektiğini belirleyin.
- Eski kayıtları ayrı bir tabloya taşıyın.
- Veya tamamen silin. Saklama süresi dolduysa.
- Bölümleme kullanmayı değerlendirin.
Dördüncü madde büyük ölçekte en zarif çözümdür: tarihe göre bölümlenmiş bir tabloda eski veriyi silmek, milyonlarca satırı tek tek silmek yerine bir bölümü kaldırmak demektir — saniyeler sürer.
Bu yapı, günlük kayıtları ve olay tabloları gibi sürekli büyüyen veriler için özellikle uygundur.
Bakım Zamanlaması
Ağır bakım işlemleri için planlama:
- Düşük trafik saatlerini seçin.
- Tabloları sırayla işleyin. Hepsini birden değil.
- Süreyi ölçün ve kaydedin.
- Kesinti gerekiyorsa duyurun.
- Öncesinde yedek alın.
İkinci madde kaynak tüketimini yayar: tüm tabloları aynı anda yeniden düzenlemek, disk ve işlemciyi doyurup uygulamayı durdurabilir.
Kaynakları kendiniz yönettiğiniz sanal sunucu paketleri üzerinde bakım işlemlerine öncelik ayarı vererek, üretim trafiğini korumak mümkündür.
Sonuç
Veritabanı zamanla yavaşlar çünkü silinen ve güncellenen kayıtlar diskte ölü alan bırakır ve tablo boyutu gerçek veriden kat kat büyür. En yüksek fayda-maliyet oranlı işlem istatistik güncellemedir: hızlıdır, kilit gerektirmez ve yanlış indeks seçiminden kaynaklanan yavaşlamaların çoğunu çözer. Tablo yeniden düzenleme ise ağırdır — tabloyu kilitleyebilir ve bakım penceresi dışında çalıştırılırsa kesinti üretir. Kullanılmayan indeksleri de temizleyin; her yazmayı yavaşlatırlar.
Sıkça Sorulan Sorular (SSS)
Veri artmadı ama sorgular yavaşladı, neden?
İki olası neden var: tablo şişmesi ve eskimiş istatistikler. Silinen ve güncellenen kayıtlar diskte ölü alan bırakır, her tarama bu alanı da okur. Ayrıca istatistikler eskiyse planlayıcı yanlış indeksi seçer veya hiç kullanmaz.
Önce ne yapmalıyım?
İstatistikleri güncelleyin. Bu işlem hızlıdır, tabloyu kilitlemez ve yanlış plan seçiminden kaynaklanan yavaşlamaların çoğunu çözer. Ağır yeniden düzenleme işlemlerini ancak bu adım sonuç vermezse planlayın.
Bakım işlemi kesintiye yol açar mı?
Tablo yeniden düzenleme işlemi tabloyu kilitleyebilir ve büyük tablolarda bu dakikalar veya saatler sürebilir. Bu süre boyunca uygulamanız o tabloya erişemez — mutlaka bakım penceresinde ve tabloları sırayla işleyerek yapın.
Kullanılmayan indeksleri silmeli miyim?
Evet. Kullanılmayan bir indeks yalnızca yer kaplamaz; her ekleme ve güncelleme işleminde o da güncellenir, yani yazma performansını sürekli düşürür. İndeks kullanım istatistiklerine bakıp hiç okunmayanları temizleyin.