MSSQL'de Milyarlarca Kayıttan Hızlı Sonuç Almak: Deneyimler ve Örnekler
MSSQL ile büyük veri setleri üzerinde çalışmak zorlayıcı olabilir, ancak doğru stratejilerle performans ciddi şekilde artırılabilir. Aşağıda, çeşitli projelerde karşılaştığım zorluklar ve uyguladığım çözümlerle nasıl performans artışı sağladığımızı örneklerle paylaşıyorum.
1. İndeksleme ile Performans Kazancı: E-Ticaret Sipariş Yönetim Sistemi
Proje Örneği: Bir e-ticaret platformu üzerinde sipariş yönetimi sistemi geliştirdik. Sistemde her gün binlerce yeni sipariş işleniyor ve veri tabanındaki sipariş kayıtları milyonlara ulaşıyordu. Ana sorun, belirli müşteri ID'lerine ve sipariş tarihlerine göre sipariş sorgularken yaşanan yavaşlıktı.
Çözüm: Orders
tablosu üzerinde sık kullanılan sorguları analiz ederek kapsamlı indeksler oluşturduk. Örneğin:
CREATE NONCLUSTERED INDEX idx_Customer_OrderDate
ON Orders(CustomerID, OrderDate)
INCLUDE (TotalAmount);
Bu indeks, müşteri ID ve tarih filtresiyle yapılan sorguların performansını dramatik şekilde artırdı. Önceden 5-10 saniye süren sorgular, indeksle birlikte 1 saniyenin altına düştü. Bu sayede, özellikle müşteri hizmetleri ve analiz ekipleri sipariş sorgularını çok daha hızlı yapmaya başladı.
2. Partisyonlama ile Zaman Bazlı Sorgu İyileştirmesi: Veri Analiz Platformu
Proje Örneği: Bir veri analiz platformunda, günlük olarak milyarlarca veri satırı işleniyordu. Bu veri setleri tarih bazlıydı ve raporlama süreçlerinde belirli tarih aralıklarına odaklanılıyordu. Ancak, her seferinde tüm tabloyu taramak büyük bir performans sorunu yaratıyordu.
Çözüm: Bu projede tabloları zaman bazlı partisyonlara ayırarak performans iyileştirmesi sağladık. Örneğin, Orders
tablosunu yıllık partisyonlara böldük:
CREATE PARTITION FUNCTION pf_OrderDate (DATETIME)
AS RANGE LEFT FOR VALUES ('2021-12-31', '2022-12-31', '2023-12-31');
Sonrasında ilgili raporlar yalnızca ilgili yılın partisyonunda çalıştırıldığı için, sorgu süreleri büyük oranda azaldı. Partisyonlama öncesinde sorgu süresi ortalama 15 saniye civarındayken, partisyonlama sonrası aynı sorgular 3-4 saniyeye kadar düştü.
3. Veri Arşivleme ile Ana Tablonun Hafifletilmesi: Finansal Raporlama Projesi
Proje Örneği: Finansal raporlama yapan bir sistemde, her gün yeni işlem verileri ekleniyor ve zamanla bu veri tabanı aşırı büyüyordu. Eski verilere nadiren erişiliyor olmasına rağmen, tüm veriler tek bir tabloda saklanıyordu, bu da aktif sorguları yavaşlatıyordu.
Çözüm: Bu projede 5 yıldan eski verileri arşivleyerek performansı artırdık. Eski verileri ayrı bir Orders_Archive
tablosuna taşıdık:
INSERT INTO Orders_Archive
SELECT * FROM Orders WHERE OrderDate < '2019-01-01';
Bu işlem, ana tablodaki verileri küçültüp aktif sorguların performansını artırdı. Veritabanı yönetim yükü de azaldı ve eski veriler gerektiğinde arşiv tablosundan hızla erişilebiliyordu. Bu sayede, ana tabloda yapılan sorgular %30-40 oranında hızlandı.
4. Index Rebuild ile Fragmentasyonun Giderilmesi: Büyük Veri Projesi
Proje Örneği: Bir büyük veri projesinde, kullanıcılar her gün milyarlarca veri ekleyip düzenliyorlardı. Bu sürekli işlem akışı indekslerde ciddi bir fragmentasyon oluşturdu. Sonuç olarak, sorgu performansı zamanla düştü.
Çözüm: Bu projede düzenli olarak indeks yeniden inşa işlemi (index rebuild) yaparak fragmentasyonu giderdik:
ALTER INDEX ALL ON Orders REBUILD;
Bu işlem, parçalanmış indeksleri toparlayarak disk erişim sürelerini kısalttı ve sorgu performansını artırdı. İndekslerin yeniden inşa edilmesiyle, sorgu süreleri %20 oranında iyileşti ve veri tabanı daha stabil hale geldi.
5. Sıkıştırma ile Veri Depolama ve Sorgulama Hızının Artırılması: IoT Verileri Projesi
Proje Örneği: Bir IoT (Nesnelerin İnterneti) platformunda, cihazlardan gelen milyonlarca veri satırı her gün MSSQL veritabanına ekleniyordu. Bu durum disk alanı kullanımını artırıyor ve okuma/yazma işlemlerini yavaşlatıyordu.
Çözüm: Bu projede verileri sıkıştırma tekniğini kullanarak hem depolama maliyetlerini düşürdük hem de sorgulama hızını artırdık:
ALTER TABLE SensorData
REBUILD WITH (DATA_COMPRESSION = PAGE);
Sıkıştırma sayesinde disk alanı kullanımı %50 oranında azaldı ve özellikle disk I/O işlemlerinde ciddi bir hızlanma elde ettik. Sorgu sürelerinde %15-20 civarında iyileşme gözlemledik.
6. Update Statistics ile Sorgu Performansını İyileştirme: Veri Analitiği Projesi
Proje Örneği: Bir veri analitiği projesinde, milyonlarca yeni veri kaydı günlük olarak MSSQL veritabanına ekleniyordu. Ancak veri sürekli güncellendiği için sorgular zamanla yavaşlamaya başladı. Sorguların uzun sürmesinin ana sebebi, veritabanının eski istatistiklerle çalışıyor olmasıydı.
Çözüm: MSSQL, sorguları en verimli şekilde çalıştırabilmek için tablo ve indekslerdeki veri dağılımına dair istatistikleri kullanır. Bu istatistikler güncellenmediğinde, MSSQL optimal sorgu planları oluşturamaz ve performans düşüşü yaşanır. Bu projede, düzenli olarak Update Statistics komutunu çalıştırarak sorgu performansını optimize ettik:
UPDATE STATISTICS Orders;
Ayrıca, veritabanı güncellemelerinin yoğun olduğu bu projede, MSSQL'in AUTO_UPDATE_STATISTICS ayarını aktif ettik, böylece verilerdeki değişikliklere bağlı olarak istatistikler otomatik olarak güncellenmeye başladı:
ALTER DATABASE [VeriAnalizDB] SET AUTO_UPDATE_STATISTICS ON;
Bu ayar, özellikle sürekli yeni veri eklenen ve güncellenen büyük veri setlerinde sorgu performansını optimize etti. Sorguların süresi %25 oranında kısaldı ve veritabanı genelinde daha stabil performans elde edildi.