İçeriğe atla
Şimdi yükleniyor
AKAşkın KILIÇ
  • Anasayfa
  • Azure & Bulut
    • Microsoft Azure
    • Bulut Altyapı
    • Microsoft 365
  • Yazılım
    • DevOps
    • Geliştirici Araçları
    • Konteyner & K8s
  • AI & Veri
    • Yapay Zeka
    • Veri & Analitik
  • Güvenlik
    • Güvenlik & Kimlik
    • Kurumsal Teknoloji
  • Hakkımda
    • İletişim
×
  • Azure
  • Bulut Altyapı
  • DevOps
  • Geliştirici Araçları
  • Güvenlik & Kimlik
  • Konteyner & Kubernetes
  • Kurumsal Teknoloji
  • Microsoft 365
  • Microsoft Azure
  • Veri & Analitik
  • Yapay Zeka
  • Başlangıç
  • DevOps
  • Covering Index ile T-SQL Sorgu Performansı
DevOps Geliştirici Araçları INCLUDE, Index Tasarımı, Sorgu Performansı, SQL Server, T-SQL Aşkın KILIÇ 21/07/2026 2 Yorumlar

Covering Index ile T-SQL Sorgu Performansı

Covering Index ile T-SQL Sorgu Performansı
📑 İçindekiler
  1. Covering Index Neden "Kapsıyor"?
  2. SQL Server Bir Sorguyu Nasıl İşler?
  3. Clustered ve Nonclustered İndeksler
  4. Covering Index ve INCLUDE Kullanımı
  5. Covering Index Tasarımı: Adım Adım
  6. Adım 1: Predicate'leri Belirle
  7. Adım 2: Taşınacak Veriyi Belirle
  8. İndeks Bakım Maliyeti ve OLTP Etkisi
  9. Ne Zaman Covering Index, Ne Zaman Genel İndeks?
  10. İlgili İçerikler
  11. Kaynaklar ve İleri Okuma

⏱️ 5 dk okuma📅 21 Temmuz 2026

Aynı sorgunun uygulama içinde defalarca çalıştırılması, veritabanı tarafında ciddi bir yük oluşturabilir. Büyük tablolara karşı çalışan sorguları hızlandırmak için indeks eklemek klasik bir çözümdür ve tabloya erişen herkes bu iyileştirmeden faydalanır. Ancak yalnızca belirli bir sorguyu hedefleyen ve o sorgunun hem filtreleme hem projeksiyon ihtiyaçlarını tek başına karşılayan özel bir tür indeks daha vardır: covering index (kapsayan indeks). Bu yazıda covering index kavramını, ne zaman anlamlı olduğunu ve nasıl tasarlanacağını Jerry Nixon’ın Azure SQL Dev Corner yazısına dayanarak ele alıyorum.

Covering Index Neden “Kapsıyor”?

Covering index ismini, hedeflediği sorgunun tüm predicate (WHERE koşulu) ve projection (SELECT sütunları) ihtiyaçlarını karşılamasından alır. Yani sorgunun filtreleme yaptığı sütunlar da, geri döndürdüğü sütunlar da indeksin içinde bulunur. Bu durumda SQL Server, satırı indekste bulur ve ihtiyaç duyulan tüm veriyi yine indeksten döndürebilir; kaynak tabloya dönmek zorunda kalmaz.

Hangi sorgunun bu ayrıcalığı hak ettiğine geliştirici karar verir. İki temel aday vardır: (1) hızlı çalışması kritik olan sorgular ve (2) uygulamada çok sık çalıştırılan sorgular. İndeksler bedava olmadığından her sorgu için ayrı bir covering index oluşturulmaz; ancak doğru sorgu için bu yaklaşım büyük fark yaratabilir.

SQL Server Bir Sorguyu Nasıl İşler?

Örnek olarak müşteri siparişlerini listeleyen tipik bir sorguyu ele alalım:

SELECT
OrderDate,
TotalAmount,
Status
FROM dbo.Orders
WHERE CustomerId = 42;

SQL Server önce doğru tabloyu tespit eder, ardından WHERE koşulundaki predicate’i uygulayarak yalnızca CustomerId = 42 olan satırları tutar. Bu adım milyonlarca satırı gereken birkaç kayda indirebilir. Son olarak SELECT içindeki projeksiyon uygulanır ve yalnızca OrderDate, TotalAmount ve Status döndürülür. CustomerId, satırları bulmak için gereklidir ama sonuç kümesinde yer almaz.

Bu filtreleme adımını hızlandırmak için SQL Server uygun bir indeks arar. İndeks yoksa motor tablodaki her satırı gezmek zorunda kalabilir. Uygun bir indeksle ise doğrudan eşleşen değerlere seek yapılabilir. Aradaki fark, büyük bir kütüphanede yerini bilmediğiniz bir kitabı aramakla, tam raf numarasına gitmek arasındaki farka benzer.

Clustered ve Nonclustered İndeksler

Primary key barındıran tablolarda genellikle bu anahtarı destekleyen bir indeks bulunur. Varsayılan olarak SQL Server bunu bir clustered index olarak oluşturur; tabloda zaten bir clustered index varsa veya farklı belirtilmişse bu değişir.

CREATE CLUSTERED INDEX IX_Orders_OrderId
ON dbo.Orders(OrderId);

Clustered index, tablodaki satırların fiziksel olarak indeks anahtarına göre sıralanmasını sağlar. Ancak Orders tablosunun birincil anahtarı büyük olasılıkla OrderId‘dir, CustomerId değil. Dolayısıyla bu indeks, 42 numaralı müşterinin tüm siparişlerini bulmakta doğrudan yardımcı olmaz.

Nonclustered index ise tabloyu yeniden düzenlemeden, eşleşen satırların nerede olduğunu işaret eden ayrı bir yapıdır:

CREATE NONCLUSTERED INDEX IX_Orders_CustomerId
ON dbo.Orders(CustomerId);

Ek olarak dikkat edilmesi gereken bir nokta: bir sütunun foreign key olması, otomatik olarak bir indekse sahip olduğu anlamına gelmez. CustomerId başka bir tabloya (Customers) referans verse de SQL Server bunun için otomatik indeks oluşturmaz.

Covering Index ve INCLUDE Kullanımı

Covering index’te clustered ya da nonclustered olması ana mesele değildir; asıl mesele sorgudur. Daha net söylersek, sorgunun predicate’leri ve döndürdüğü sütunlar belirleyicidir. Herhangi bir indeks bir sorguya genel anlamda fayda sağlayabilir; ancak covering index, o sorgunun predicate’lerine ve projeksiyon sütunlarına bilinçli olarak uyacak şekilde tasarlanır.

Bu noktada INCLUDE anahtar kelimesi devreye girer. INCLUDE, sütunları indeksin anahtarına dahil etmeden indekse ekler:

CREATE NONCLUSTERED INDEX IX_Orders_CustomerId
ON dbo.Orders(CustomerId)
INCLUDE (OrderDate, TotalAmount, Status);

SQL Server, predicate değerini indekste bulup sorgunun istediği tüm sütunlar da bu indekste yer alıyorsa kaynak tabloya hiç dönmeyebilir. Predicate eşleşmesini indekste bulmak ve zaten oradayken projeksiyon sütunlarını da indeksten döndürmek, sorgu sonuçlarına ulaşmanın en hızlı yollarından biridir.

Covering Index Tasarımı: Adım Adım

Adım 1: Predicate’leri Belirle

Tasarıma sorguyla başlanır. Önce predicate’lerde kullanılan sütunlar tespit edilir. Filtre arayüzleri veya kullanıcı davranışına göre WHERE koşulları dinamik olarak değişiyorsa, kullanılan sütunların üst kümesini ya da temel kullanım senaryolarındaki sütunları belirlemek gerekir. Örnek sorgumuzda bu yalnızca CustomerId‘dir:

CREATE NONCLUSTERED INDEX IX_Orders_CustomerId
ON dbo.Orders(CustomerId);

Parantez içindeki sütunlar indeksin anahtar sütunlarıdır; sıralıdırlar ve SQL Server tarafından eşleşen satırları bulmak için kullanılırlar.

Sütun sırası önemlidir. Eşitlik (equality) predicate’lerini önce, aralık (range) predicate’lerini sonra koymak gerekir; çünkü SQL Server öncelikle baştaki indeks sütunlarını kullanarak aramayı daraltır. INCLUDE ile eklenen sütunların sırası genellikle önemli değildir; projeksiyon sütunlarının sırası da çoğunlukla belirleyici olmaz.

Adım 2: Taşınacak Veriyi Belirle

Tablo verisini indekse kopyalarken, özellikle veri tipleri büyükse dikkatli olmak gerekir. JSON, vektör veya binary veri içeren sütunları INCLUDE etmeden önce iki kez düşünmek gerekir.

Eğer projeksiyon sütunları örnekteki gibi OrderDate, TotalAmount ve Status gibi makul boyuttaysa ve ek depolama maliyetine razıysanız hepsini indekse dahil etmek mantıklıdır:

CREATE NONCLUSTERED INDEX IX_Orders_CustomerId
ON dbo.Orders(CustomerId)
INCLUDE (OrderDate, TotalAmount, Status);

Burada iki önemli uyarı vardır:

  • Projeksiyon sütunlarından yalnızca birini bile INCLUDE dışında bırakırsanız SQL Server o eksik değer için kaynak tabloya dönmek zorunda kalabilir. Bu durum, covering index’in temel kazancını büyük ölçüde ortadan kaldırır.
  • Diğer uçta, tablodaki tüm sütunları INCLUDE ederseniz kaynak tabloyu neredeyse birebir kopyalamış olursunuz; bu da gereksiz depolama ve bakım maliyeti getirir.

İndeks Bakım Maliyeti ve OLTP Etkisi

İndeksler kendini otomatik olarak günceller. Bir indeks oluşturulduktan sonra, tablodaki her değişiklik ilgili indeksleri de günceller. INSERT, UPDATE veya DELETE işlemleri, etkilenen tüm indeksler güncellenene kadar tamamlanmayabilir. Bu nedenle büyük ya da aşırı sayıda indeks, veritabanının OLTP performansını olumsuz etkileyebilir. Yani her sorgu için covering index yaratmak bir çözüm değil, bir kod kokusudur.

Ne Zaman Covering Index, Ne Zaman Genel İndeks?

Covering index, doğru sorgu için adeta bir gizli sos gibidir; ancak yalnızca bazı sorgular için. Veritabanının geri kalanı ve diğer sorgular için, birden fazla sorguya hizmet edebilecek daha genel indeksler oluşturmak çoğu zaman daha mantıklıdır.

Azure SQL’in otomatik ayarlama (automatic tuning) özelliği, sorgu aktivitesini analiz ederek ek indekslerden fayda sağlayabilecek veya mevcut indekslerde değişiklik gerektirecek sorguları belirler. Aynı analiz manuel olarak da yapılabilir. Yeni bir covering index eklerken yalnızca kâğıt üzerindeki teoriye güvenmemek, üretim boyutundaki tablolarla test etmek ve iş yükünde istenmeyen yan etkiler oluşup oluşmadığını doğrulamak önemlidir.

Sonuçta veritabanı performansının anahtarı; iyi tasarlanmış bir şema, iyi yazılmış sorgular ve uygun indekslerdir. Uygulamada bir “sıcak nokta” tespit ettiğinizde, SQL Server Management Studio içindeki Copilot’a sorguyu yapıştırıp bu sorgu için bir covering index tasarlamasını istemek başlangıç noktası olarak kullanılabilir.

İlgili İçerikler

  • T-SQL Regex Artık Büyük Veride de Rahat: CU5 Detayı
  • Azure DevOps’ta SQL Projeleri: Pipeline Kurmanın Temelleri
  • Microsoft SQL 2026 Yol Haritası: Sahadan Süzülmüş Notlar

Kaynaklar ve İleri Okuma

  • devblogs.microsoft.com
  • T-SQL Hygiene: Introducing the Covering Index — Jerry Nixon, Azure SQL Dev Blog
  • GitHub Copilot in SQL Server Management Studio: Get Started
  • Azure SQL Dev Blog
🤖Bu yazı yapay zeka (büyük dil modelleri) ile hazırlanmış, insan editör tarafından incelenmiştir. İçerik üretim sürecimiz.
Aşkın KILIÇ
Aşkın KILIÇYazar

20+ yıl deneyimli Azure Solutions Architect. Microsoft sertifikalı bulut mimari ve DevOps danışmanı. Azure, yapay zekâ ve bulut teknolojileri üzerine Türkçe teknik içerikler üretiyor.

AZ-305AZ-104AZ-500AZ-400DP-203AI-102

İlgili Yazılar

Run Dialog Yenilendi: Hız, Sadelik ve Güç Bir Arada
Run Dialog Yenilendi: Hız, Sadelik ve Güç Bir Arada3 May 2026
Intelligent Terminal 0.2: Yerel Model Desteği Geldi
Intelligent Terminal 0.2: Yerel Model Desteği Geldi11 Ağu 2026
Copilot Code Review: Agent Skills ve MCP Genel Kullanıma
Copilot Code Review: Agent Skills ve MCP Genel Kullanıma1 Ağu 2026
GitHub Issues'ta Kişisel Saved Views ve Relates to
GitHub Issues'ta Kişisel Saved Views ve Relates to26 Eyl 2026

Bu içerik işinize yaradı mı?

Benzer içerikleri kaçırmamak için YouTube ve GitHub hesaplarımı takip edin.

YouTube GitHub

Haftalık Bülten

Her pazar özenle seçilmiş teknoloji yazıları doğrudan e-postanıza gelsin.

Etiket INCLUDE Index Tasarımı Sorgu Performansı SQL Server T-SQL
Önceki yazı

vcpkg ve Copilot CLI ile C++ Bağımlılık Kurulumu

Sonraki yazı

Gemini 3.6 Flash GitHub Copilot’ta Kullanıma Sunuldu

İlginizi Çekebilir

.NET MAUI Xcode 27 Uyumu: Scene Lifecycle Geçişi
Aşkın KILIÇ 0

.NET MAUI Xcode 27 Uyumu: Scene Lifecycle Geçişi

19/10/2026
Visual Studio 2026 18.11: Sekmeleri Klavyeyle Taşıyın
Aşkın KILIÇ 0

Visual Studio 2026 18.11: Sekmeleri Klavyeyle Taşıyın

19/10/2026
Visual Studio Subscription: VSLive! San Diego Dersleri
Aşkın KILIÇ 0

Visual Studio Subscription: VSLive! San Diego Dersleri

19/10/2026

2 comments

comments user
Cenk B. 21/07/2026 18:38

Covering index konusunu teoride biliyordum ama INCLUDE kolonlarının nasıl çalıştığını tam kavrayamamıştım, bu yazı netleştirdi. Acaba çok sayıda INCLUDE kolonu eklemek indeks boyutunu ciddi etkiler mi, bununla ilgili bir kılavuz var mı?

comments user
Özge D. 21/07/2026 21:31

Biz production’da bu yüzden çok acı çektik, sorgu planına bakınca key lookup’ların ne kadar pahalıya mal olduğunu görünce covering index’e geçtik, fark gece gündüz gibiydi. INCLUDE kolonlarını seçerken biraz dikkatli olmak lazım tabii, her şeyi oraya doldurunca indeks boyutu şişiyor.

Yorumlar kapalı.

Yazı Ara

Takip Edin

  • Takipçi
  • Takipçi
  • Takipçi
  • Abone
  • Takipçi
  • .NET MAUI Xcode 27 Uyumu: Scene Lifecycle Geçişi
    19/10/2026 .NET MAUI Xcode 27 Uyumu: Scene Lifecycle Geçişi
  • Visual Studio 2026 18.11: Sekmeleri Klavyeyle Taşıyın
    19/10/2026 Visual Studio 2026 18.11: Sekmeleri Klavyeyle Taşıyın
  • Visual Studio Subscription: VSLive! San Diego Dersleri
    19/10/2026 Visual Studio Subscription: VSLive! San Diego Dersleri
  • Azure MCP Server 3.0: Yeni Araçlar ve Yükseltme Notları
    19/10/2026 Azure MCP Server 3.0: Yeni Araçlar ve Yükseltme Notları
  • GitHub Copilot'ta Kaldırılan Modeller ve Geçiş Planı
    18/10/2026 GitHub Copilot’ta Kaldırılan Modeller ve Geçiş Planı
  • DevOps Güncellemeleri
    09/03/2026 Azure DevOps Server Şubat Güncellemesi: Güvenlik
  • 2026-03-10_15-35-23
    10/03/2026 Microsoft 365 E7: Yapay Zeka ve Güvenlik Bir Arada
  • GitHub Copilot Pro Denemeleri Neden Durdu?
    11/04/2026 GitHub Copilot Pro Denemeleri Neden Durduruldu?
  • Artımlı Anlık Görüntü: Anında Geri Yükleme
    09/03/2026 Artımlı Anlık Görüntü: Anında Geri Yükleme
  • Bulut Sunucu Altyapısı
    09/03/2026 Microsoft Sovereign Cloud: İzolasyonda Güvenli Bulut
  • GitHub Copilot Pro Denemeleri Neden Durdu?
    11/04/2026 GitHub Copilot Pro Denemeleri Neden Durduruldu?
  • vcpkg'de Paralel Kurulum ve Güvenlik Yaması: Neler Değişti?
    06/04/2026 vcpkg’de Paralel Kurulum ve Güvenlik Yaması: Neler Değişti?
  • MCP Apps’i Kolaylaştıran Fluent API: Sahada Ne Değişiyor?
    08/04/2026 MCP Apps’i Kolaylaştıran Fluent API: Sahada Ne Değişiyor?
  • Yapay Zekâ Çağında Sanayi Politikası: Asıl Mesela Ne?
    06/04/2026 Yapay Zekâ Çağında Sanayi Politikası: Asıl Mesela Ne?
  • Microsoft Foundry Mart 2026: Sahadan İlk İzlenimler
    10/04/2026 Microsoft Foundry Mart 2026: Sahadan İlk İzlenimler

Hakkımda

Aşkın KILIÇ

Microsoft Azure Çözüm Uzmanı. Bulut bilişim, yapay zekâ, DevOps ve kurumsal güvenlik üzerine yazılar yazıyorum.

Devamını Oku →

Kategoriler

  • Azure
  • Bulut Altyapı
  • DevOps
  • Geliştirici Araçları
  • Güvenlik & Kimlik
  • Konteyner & Kubernetes
  • Kurumsal Teknoloji
  • Microsoft 365
  • Microsoft Azure
  • Veri & Analitik
  • Yapay Zeka

Popüler Etiketler

AI ajanları ASP.NET Core Azure azure app service Azure Cosmos DB Azure Developer CLI Azure DevOps Azure OpenAI azure sdk Azure SQL CI/CD code review copilot Copilot CLI DevOps geliştirici verimliliği GitHub GitHub Actions GitHub Copilot güvenlik Kimlik Doğrulama Kubernetes Kurumsal geliştirme kurumsal güvenlik kurumsal yapay zeka maliyet optimizasyonu MCP Microsoft Agent Framework Microsoft Azure Microsoft Entra ID Microsoft Foundry otomasyon performans public preview Pull Request RAG REST API SEO uyumlu verimlilik veri yönetimi Visual Studio Visual Studio 2026 VS Code yapay zeka Yazılım geliştirme
  • Gizlilik Politikası
  • Çerez Politikası
  • Kullanım Koşulları
  • Hakkımda
  • İletişim

© 2026 Aşkın KILIÇ | Tüm hakları saklıdır. | Powered By SpiceThemes

Çerez tercihleri Zorunlu çerezler sitenin çalışması için kullanılır. Analitik çerezler yalnız açık izninizden sonra Google Analytics ve Microsoft Clarity için etkinleştirilir. KVKK ve Çerez Politikası
✉

Haftalık Bülten

Azure, DevOps ve Yapay Zeka dünyasındaki en güncel içerikleri her hafta doğrudan e-postanıza alın.

Spam yok. İstediğiniz zaman iptal edebilirsiniz.
📱
Uygulamayı Yükle Ana ekrana ekle, çevrimdışı oku
Ana Sayfa
Kategoriler
💻 Geliştirici Araçları 507 yazı 🏗️ Bulut Altyapı 407 yazı 🤖 Yapay Zeka 331 yazı ☁️ Microsoft Azure 279 yazı 🔧 DevOps 277 yazı 🔒 Güvenlik & Kimlik 223 yazı 🏢 Kurumsal Teknoloji 107 yazı 📊 Veri & Analitik 78 yazı 🐳 Konteyner & Kubernetes 62 yazı 📧 Microsoft 365 22 yazı 📁 Azure 1 yazı
Ara
Popüler
Yapay Zeka Azure Kubernetes DevOps Copilot Docker
Paylaş
WhatsApp
İçindekiler
    ← vcpkg ve Copilot CLI ile C++ B...
    Gemini 3.6 Flash GitHub Copilo... →
    📩

    Gitmeden önce!

    Her pazar özenle seçilmiş teknoloji yazıları ve AI haberleri doğrudan e-postanıza gelsin. Ücretsiz, spam yok.

    🔒 Bilgileriniz güvende. İstediğiniz zaman ayrılabilirsiniz.

    📬 Haftalık bülten: Teknoloji + AI haberleri
    Beni Takip Et Yeni Azure / AI / DevOps yazılarını GitHub ve RSS üzerinden takip edin.
    GitHub RSS