Veritabanı yönetiminde indexler, performans iyileştirmesinin temel taşlarından biridir. Bu yazıda, SQL Server’daki indexler hakkındaki yaygın yanılgıları düzeltecek, index türlerini ve özelliklerini inceleyecek ve özellikle veri yazma performansına etkilerini ele alacağız.
1. SQL Server ve Indexler Hakkında Doğru Sanılan Yanlışlar
Yanılgı 1: “Ne kadar çok index, o kadar iyi performans.”
Gerçek: Aşırı index kullanımı, özellikle veri ekleme, güncelleme ve silme işlemlerinde performansı düşürebilir.
Örnek: 100 sütunlu bir müşteri tablosunda her sütun için ayrı index oluşturmak, basit bir müşteri ekleme işlemini bile çok yavaşlatabilir.
Yanılgı 2: “Clustered index her zaman primary key üzerinde olmalıdır.”
Gerçek: Primary key genellikle iyi bir clustered index adayıdır, ancak her zaman en iyi seçim olmayabilir.
Örnek: Bir e-ticaret sitesindeki sipariş tablosunda, sipariş tarihi üzerinde clustered index oluşturmak, tarih bazlı sorguları hızlandırabilir.
Yanılgı 3: “Indexler otomatik olarak kullanılır.”
Gerçek: SQL Server’ın query optimizer’ı bazen indexleri kullanmamayı tercih edebilir.
Örnek: Küçük bir tabloda, tüm satırları okumak, index kullanmaktan daha hızlı olabilir.
2. Index Türleri ve Özellikleri
- Clustered Index:
- Her tabloda yalnızca bir tane olabilir.Tablonun fiziksel sıralamasını belirler.
CREATE CLUSTERED INDEX IX_Employees_LastName ON Employees (LastName)
- Non-Clustered Index:
- Bir tabloda birden fazla olabilir.Ayrı bir yapıda saklanır ve orijinal tabloyu işaret eder.
CREATE NONCLUSTERED INDEX IX_Employees_Email ON Employees (Email)
- Columnstore Index:
- Büyük veri kümeleri ve analitik sorgular için optimize edilmiştir.
CREATE COLUMNSTORE INDEX IX_Sales_Columnstore ON Sales (OrderDate, ProductID, Quantity, UnitPrice)
- Filtered Index:
- Tablonun sadece bir alt kümesi için oluşturulan indexler.
CREATE NONCLUSTERED INDEX IX_Employees_ActiveStatus ON Employees (EmployeeID) WHERE IsActive = 1
3. Indexlerin Veri Yazma Performansına Etkisi
Indexler okuma performansını artırırken, yazma performansını etkileyebilir.
INSERT İşlemleri:
- Her yeni kayıt eklendiğinde, tablodaki tüm indexler güncellenir.
Örnek: 5 farklı index’e sahip bir
Customers
tablosuna yeni bir müşteri eklerken, sistem aslında 6 yazma işlemi yapar (1 tablo + 5 index için).
UPDATE İşlemleri:
- Güncellenen sütun(lar) indexlenmişse, ilgili indexler güncellenir.
Örnek:
Employees
tablosundaki
LastName
sütunu üzerinde clustered index varsa, bir çalışanın soyadını değiştirmek, tüm tablonun fiziksel sıralamasını etkileyebilir.
DELETE İşlemleri:
- Silinen her kayıt için, tüm ilgili indexlerden girişler kaldırılmalıdır.
Örnek: 10 farklı index’e sahip bir
Orders
tablosundan bir sipariş sildiğinizde, sistem 11 silme işlemi gerçekleştirir.
İyileştirme Stratejileri:
- Seçici Indexleme: Sadece gerçekten gerekli olan sütunları indexleyin.Seçici indexleme, veritabanındaki her sütun için değil, yalnızca sık kullanılan sorgularda filtreleme, sıralama veya birleştirme için kullanılan sütunlar üzerinde index oluşturma pratiğidir. Bu yaklaşım, gereksiz index bakımını önler ve yazma performansını iyileştirir.
Örnek: BirCustomers
tablosunda, müşterilerin adı, soyadı, e-posta adresi, telefon numarası ve adresi olduğunu düşünelim. Eğer sorgularınız genellikle e-posta ve soyadı üzerinden yapılıyorsa, sadece bu iki sütun için index oluşturmak, tüm sütunlar için index oluşturmaktan daha etkili olacaktır.
CREATE NONCLUSTERED INDEX IX_Customers_Email_LastName ON Customers (Email, LastName)
Bu şekilde, sık kullanılan sorgular hızlanırken, diğer sütunlara yapılan güncellemeler index bakımı gerektirmeyecektir. - Filtered Indexler: Örneğin, sadece aktif müşteriler için bir index oluşturabilirsiniz.
- Batch İşlemler: Örneğin, 1000 satırı tek tek eklemek yerine, toplu olarak ekleyin.
- Index Bakımı: Düzenli olarak index fragmantasyonunu kontrol edin ve gerekirse yeniden oluşturun.
Sonuç
Indexler, SQL Server performans optimizasyonunda güçlü araçlardır, ancak dikkatli kullanılmalıdırlar. Doğru index stratejisi, veritabanınızın okuma ve yazma performansı arasında optimal bir denge sağlamalıdır. Her uygulamanın kendine özgü gereksinimleri olduğunu unutmayın ve index tasarımınızı buna göre şekillendirin. Seçici indexleme, bu dengeyi sağlamada önemli bir rol oynar ve gereksiz sistem yükünü azaltarak genel veritabanı performan