COMPUTER ENGINEER

Örneklere git
Blog
Next.js / ASP.NET Core / SQL6 dk çalışma
29/ 41

Veri katmanı ve SQL

SQL Server sorguyu nasıl çalıştırır: plan ve indeks

Sorgu iyileştirici, indeksler ve Seek ile Scan arasındaki fark.

AnlaÖrneği inceleKendin uygula

Kavramı anlayalım

SQL Server bir sorgu aldığında önce onu ayrıştırır, sonra sorgu iyileştirici olası çalıştırma planları arasından tahmini maliyeti en düşük olanı seçer. Bu karar istatistiklere dayanır: hangi değerden kaç satır olduğu tahmini. Seçilen plan önbelleğe alınır; aynı biçimdeki parametreli sorgu tekrar geldiğinde yeniden derlenmez. Parametreli sorguların performans faydası da buradan gelir.

İndeks, kitabın arkasındaki dizin gibidir. Slug kolonunda bir indeks varsa ‘WHERE Slug = @p’ sorgusu doğrudan ilgili satıra gider (Index Seek). İndeks yoksa SQL Server bütün tabloyu okumak zorunda kalır (Scan). Küçük tabloda fark görünmez; milyonlarca satırda saniyelerle milisaniyeler arasındaki farktır.

İndeksler bedavadır değildir: her INSERT ve UPDATE indeksleri de günceller ve disk alanı harcar. Doğru indeks, gerçek sorgulara bakılarak seçilir. Çalıştırma planını okumak (SSMS’te ‘Include Actual Execution Plan’) ve okunan sayfa sayısını ölçmek (SET STATISTICS IO ON) tahmin yerine ölçüm yapmanın yoludur. Ayrıntılar için SQL öğrenme merkezinin performans modülüne bakabilirsin.

NERESİNDE KULLANIRSIN?

Uygulamanın en yavaş kısmı çoğu zaman eksik veya yanlış bir indekstir.

SIK YAPILAN HATA

Her kolona indeks eklemek; yazma işlemleri yavaşlar ve iyileştiricinin işi zorlaşır.

01 / UYGULAMA

Aynı konu. Üç farklı derinlik.

Temsili örnek
CREATE UNIQUE INDEX IX_Posts_Slug ON dbo.Posts (Slug);
-- WHERE Slug = @p sorgusu artık Index Seek kullanır

Sık aranan ve benzersiz olan kolon için indeks.

Bu sayfa gerçek bir sunucuya veya veritabanına bağlanmaz. Kod örnekleri .NET 8, Next.js ve SQL Server için temsilîdir; süreler simülasyondaki örnek değerlerdir, ölçüm değildir. Örnekleri yalnız kendi geliştirme ortamında dene; gerçek bağlantı dizesi, token veya parola paylaşma.

02 / SIRA SENDE

Önce kendin dene.

‘Son 10 yayımlanmış yazı’ sorgusu 200 bin satırlı tabloda 900 ms sürüyor; plan ‘Clustered Index Scan’ gösteriyor. Sorgu: WHERE IsPublished = 1 ORDER BY PublishedAtUtc DESC. Ne önerirsin?

Çözümü ve açıklamasını göster
Açıklamalı çözüm
CREATE INDEX IX_Posts_Published_Date
  ON dbo.Posts (IsPublished, PublishedAtUtc DESC)
  INCLUDE (Title, Slug);
-- Seek + sıralı okuma; TOP 10 ilk 10 satırda durur.

Filtre ve sıralama kolonları indeks anahtarında, döndürülen kolonlar INCLUDE’da olunca sorgu tabloyu taramadan ve sıralamadan biter.