İçeriğe atla
Şimdi yükleniyor
  • 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.KILIÇ 21/07/2026 0 Yorumlar

Covering Index ile T-SQL Sorgu Performansı

Covering Index ile T-SQL Sorgu Performansı
Ana Sayfa › DevOps › 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👁️ görüntülenme

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
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

Kubernetes Custom Metrics Exporter Nasıl Yazılır?
Kubernetes Custom Metrics Exporter Nasıl Yazılır?15 Tem 2026
VS Code’da MSSQL Eklentisinde Neler Değişti? Yapay Zekâlı Şema Tasarımı ve Daha Fazlası
VS Code’da MSSQL Eklentisinde Neler Değişti? Yapay Zekâlı Şema Tasarımı ve Daha Fazlası25 Mar 2026
Azure DevOps Server Mayıs Yamaları: Neyi, Neden, Nasıl Kontrol Etmeli?
Azure DevOps Server Mayıs Yamaları: Neyi, Neden, Nasıl Kontrol Etmeli?17 May 2026
JetBrains Copilot Artık CLI Üzerinde Çalışacak: Ne Değişiyor?
JetBrains Copilot Artık CLI Üzerinde Çalışacak: Ne Değişiyor?24 Haz 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
A.KILIÇ

Microsoft Azure Çözüm Uzmanı | Bulut Bilişim, Yapay Zekâ, DevOps ve Kurumsal Güvenlik alanlarında 15+ yıl deneyim. Azure, Kubernetes, AI/ML ve modern altyapı mimarileri üzerine yazılar yazıyorum.

view all posts
Önceki yazı

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

İlginizi Çekebilir

vcpkg ve Copilot CLI ile C++ Bağımlılık Kurulumu
A.KILIÇ 0

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

21/07/2026
Copilot Kullanım Sayfasında AI Kredi Görünürlüğü Geldi
A.KILIÇ 0

Copilot Kullanım Sayfasında AI Kredi Görünürlüğü Geldi

20/07/2026
Visual Studio'da Yerleşik Agent Skills: .NET ve Azure
A.KILIÇ 0

Visual Studio’da Yerleşik Agent Skills: .NET ve Azure

20/07/2026

Yorum gönder Yanıtı iptal et

Yazı Ara

Takip Edin

  • Takipçi
  • Takipçi
  • Takipçi
  • Abone
  • Takipçi
  • Covering Index ile T-SQL Sorgu Performansı
    21/07/2026 Covering Index ile T-SQL Sorgu Performansı
  • vcpkg ve Copilot CLI ile C++ Bağımlılık Kurulumu
    21/07/2026 vcpkg ve Copilot CLI ile C++ Bağımlılık Kurulumu
  • Copilot Kullanım Sayfasında AI Kredi Görünürlüğü Geldi
    20/07/2026 Copilot Kullanım Sayfasında AI Kredi Görünürlüğü Geldi
  • Visual Studio'da Yerleşik Agent Skills: .NET ve Azure
    20/07/2026 Visual Studio’da Yerleşik Agent Skills: .NET ve Azure
  • .NET 11 Preview 6 Yayınlandı: Öne Çıkan Yenilikler
    20/07/2026 .NET 11 Preview 6 Yayınlandı: Öne Çıkan Yenilikler
  • Veri Merkezi Güvenilirliği
    09/03/2026 Azure’da Kesintisiz Çalışma: Güvenilirlik ve Kurtarma
  • 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?
  • Kubernetes v1.36 Memory QoS: Katmanlı Bellek Koruması Geldi
    30/04/2026 Kubernetes v1.36 Memory QoS: Katmanlı Bellek Koruması Geldi
  • GitHub Copilot for Eclipse Açık Kaynağa Dönüyor: Neden Önemli?
    08/04/2026 GitHub Copilot for Eclipse Açık Kaynağa Dönüyor: Neden Önemli?
  • 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

SİZİN İÇİN DERLEDİK

Covering Index ile T-SQL Sorgu Performansı
DevOps Geliştirici Araçları

Covering Index ile T-SQL Sorgu Performansı

21/07/2026 A.KILIÇ
vcpkg ve Copilot CLI ile C++ Bağımlılık Kurulumu
Bulut Altyapı DevOps Geliştirici Araçları

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

21/07/2026 A.KILIÇ
Copilot Kullanım Sayfasında AI Kredi Görünürlüğü Geldi
Bulut Altyapı Geliştirici Araçları

Copilot Kullanım Sayfasında AI Kredi Görünürlüğü Geldi

20/07/2026 A.KILIÇ
Visual Studio'da Yerleşik Agent Skills: .NET ve Azure
Bulut Altyapı Geliştirici Araçları Yapay Zeka

Visual Studio’da Yerleşik Agent Skills: .NET ve Azure

20/07/2026 A.KILIÇ
.NET 11 Preview 6 Yayınlandı: Öne Çıkan Yenilikler
Bulut Altyapı Geliştirici Araçları Yapay Zeka

.NET 11 Preview 6 Yayınlandı: Öne Çıkan Yenilikler

20/07/2026 A.KILIÇ
.NET MAUI Preview 6: CoreCLR Tek Çalışma Zamanı Oldu
Bulut Altyapı Geliştirici Araçları Microsoft Azure

.NET MAUI Preview 6: CoreCLR Tek Çalışma Zamanı Oldu

20/07/2026 A.KILIÇ
Copilot Code Review: Özelleştirme ve Yapılandırma
DevOps Geliştirici Araçları Güvenlik & Kimlik

Copilot Code Review: Özelleştirme ve Yapılandırma

19/07/2026 A.KILIÇ
.NET ve .NET Framework Temmuz 2026 Servis Güncellemeleri
Geliştirici Araçları Güvenlik & Kimlik Kurumsal Teknoloji

.NET ve .NET Framework Temmuz 2026 Servis Güncellemeleri

19/07/2026 A.KILIÇ
Azure Databricks'in İş Değeri: Forrester TEI Bulguları
Bulut Altyapı Microsoft Azure Veri & Analitik Yapay Zeka

Azure Databricks’in İş Değeri: Forrester TEI Bulguları

19/07/2026 A.KILIÇ
Visual Studio Model Picker: Modelleri Seç, Yönet, Verim Al
Geliştirici Araçları Yapay Zeka

Visual Studio Model Picker: Modelleri Seç, Yönet, Verim Al

19/07/2026 A.KILIÇ
Visual Studio Private Marketplace Önizlemesi Başlıyor
Geliştirici Araçları Güvenlik & Kimlik Kurumsal Teknoloji

Visual Studio Private Marketplace Önizlemesi Başlıyor

18/07/2026 A.KILIÇ
GitHub Copilot app now available in the usage metrics API
Bulut Altyapı DevOps Güvenlik & Kimlik

GitHub Copilot app now available in the usage metrics API

18/07/2026 A.KILIÇ

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ı Azure Azure Cosmos DB Azure Developer CLI Azure DevOps Azure Functions Azure OpenAI azure sdk Azure SQL açık kaynak bulut bilişim C++ CI/CD copilot Copilot CLI DevOps DevSecOps 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 Microsoft Agent Framework Microsoft Azure Microsoft Foundry OpenAI otomasyon performans Pull Request Python RAG SEO uyumlu verimlilik veri yönetimi Visual Studio VS Code yapay zeka yapay zeka ajanları 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ı 301 yazı 🏗️ Bulut Altyapı 256 yazı 🤖 Yapay Zeka 218 yazı 🔧 DevOps 175 yazı ☁️ Microsoft Azure 169 yazı 🔒 Güvenlik & Kimlik 154 yazı 🏢 Kurumsal Teknoloji 64 yazı 📊 Veri & Analitik 55 yazı 🐳 Konteyner & Kubernetes 44 yazı 📧 Microsoft 365 19 yazı 📁 Azure 1 yazı
Ara
Popüler
Yapay Zeka Azure Kubernetes DevOps Copilot Docker
Paylaş
WhatsApp
İçindekiler
    ← vcpkg ve Copilot CLI ile C++ B...
    →
    📩

    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