Clustered ve nonclustered
| Clustered | Nonclustered | |
|---|---|---|
| Tabloda kaç tane? | En fazla 1 | Çok sayıda (999'a kadar) |
| Ne saklar? | Verinin kendisi bu sıraya göre dizilir | Anahtar + satıra işaretçi (clustered anahtar) |
| Varsayılan | PRIMARY KEY ile otomatik | CREATE INDEX ile |
Clustered indeksi olmayan tabloya heap denir. İyi bir clustered anahtar dar, benzersiz, sürekli artan ve değişmeyen olmalıdır (ör. IDENTITY).
Kapsayan (covering) indeks: INCLUDE
Sorgunun ihtiyaç duyduğu tüm sütunlar indekste varsa SQL Server tabloya hiç gitmez (Key Lookup ortadan kalkar):
CREATE NONCLUSTERED INDEX ix_orders_customer
ON orders (customer_id, order_date)
INCLUDE (status, channel);
EXEC sp_helpindex 'orders';
Filtreli indeks
Yalnızca bir alt kümeyi indeksler: daha küçük, daha hızlı. Örneğin sadece iptal edilmiş siparişleri sık sorguluyorsan:
CREATE NONCLUSTERED INDEX ix_orders_iptal
ON orders (order_date)
WHERE status = 'cancelled';
SELECT COUNT(*) FROM orders WHERE status = 'cancelled' AND order_date >= '2024-01-01';
Columnstore
Analitik sorgular için veriyi sütun sütun, sıkıştırılmış saklar: milyonlarca satırlık toplamlarda 10 kat ve üzeri hız. CREATE CLUSTERED COLUMNSTORE INDEX cci_sales ON fact_sales;
Yürütme planında neye bakılır?
- Index Seek iyi, Index/Table Scan büyük tabloda genelde kötü.
- Key Lookup: Eksik sütun → INCLUDE ile çöz.
- Tahmini ve gerçek satır sayısı arasında büyük fark: güncel olmayan istatistik (
UPDATE STATISTICS). - Uyarı simgeleri: örtük dönüşüm, tempdb'ye taşma (spill).
BakımZamanla indeksler parçalanır (fragmentation).
sys.dm_db_index_physical_stats ile ölçülür; yaygın başlangıç kuralı %5–30 için REORGANIZE, %30 üzeri için ALTER INDEX ... REBUILD, 1000 sayfadan küçük indekse dokunmamaktır; ayrıntı ve bu eşiklerin tartışması Bakım dersinde (dba-bakim). sys.dm_db_missing_index_details eksik indeks önerileri verir (körü körüne uygulama!).