SQL Server Index

SQL Server Index Kavramı nedir?

Indexler, veritabanı tabloları üzerinde tanımlanan kullanıcıların sık sık araması gereken kayıtları bulmaya yönelik veriye daha az işlemle daha hızlı ulaşmayı sağlayan veritabanı SQL Server objeleridir.

Peki Neden SQL Server Index Kavramına İhtiyaç Duyarız

Baktığımızda veritabanlarımızda saklanan veriler büyüdüğünde sorgu performansı arttırmak bizler için önemlidir. Index yapısını kullanmadığımızda genellikle sunucularda yüksek CPU kullanımına, uzun süren sorgu ve yanıt sürelerine bu gibi sorunlar kullanıcı memnuniyetsizliğine sebep olmaktadır. Bu gibi sorunlar yaşamamak adına veritabanı tablolarımızda index yapısını kullanmak önemlidir.

Indexleri oluştururken de dikkat etmemiz gereken diğer bir konu index tasarlamasını iyi yapmaktan geçer eğer bir tablo üzerinde çok fazla insert,delete ve update gibi işlemler varsa bu tablo üzerinde index oluşturmak işlemleri hızlandırmanın aksine yavaşlatabilir. Kısacası indexleri oluştururken veritabanı ve tabloların kullanım amacına göre uygun yapılandırmalıyız.

Index Kavramının Çalışma Mantığı

Indexler B-tree yapısında çalışmaktadır. Nedir peki B-tree yapısı?

B-tree Root Node, Intermediate Node ve Leaf Node olmak üzere üç bölümden oluşmaktadır. Yapıda en üst katmanda yer alan Root Node(Kök Düğüm) index’ten gelen arama ilk olarak buradan başlar ve aşağı doğru devam eder. Bir sonraki Intermediate Node(Ara Düğüm) index’in büyüklüğüne göre birden fazla intermediate node oluşturabilir adresini belirlemek için aşağıdaki örnekte görüldüğü üzere 96 numaralı kaydı aramak için ilk olarak Root Node’dan başlar devamında Intermediate Node’da işaret edilen node yönlendirir. Son aşama olarak Leaf Node yapısına ilerler burada veriye ulaşmak için her zaman en son aşamaya gelmemiz gerekmektedir. Index yapısına göre Clustered ya da Non Clustered olarak veriye ulaşabiliriz.

Resim-1

Index Türleri

Clustered Index

Clustered Index’ler verilerin fiziksel olarak diskte nasıl tutulacağını belirler, bir tablo fiziksel olarak sıralandığı için bu sıralamada sıralama ölçü sırasına göre tablo üzerinde yalnızca bir adet Clustered Index(kümelenmiş dizin) tanımlanabilir. Seçilecek sütunlar sorgularda en çok kullanılan sütunlar olmalıdır. Bunun sebebi fiziksel olarak bu sütunlara göre sıralanacağı için çok hızlı bir şekilde erişim sağlayabillmektir. Aslında SQL sunucusu, indeks ihtiyacını kendisi belirler.

Non Clustered Index

Non Clustered(Kümelenmemiş dizin) bir tabloya birden fazla olacak şekilde eklenebilir ve bu sayede birden fazla sütuna hızlı erişim sunar. Verileri fiziksel olarak değil mantıksal olarak sıralar verinin kendisini değil, verinin nerede olduğu bilgisini depolar. Yalnızca belirli bir sütuna göre bir dizin oluşturur ve diğer sütunlarda herhangi bir sıralama veya düzenleme yapılmaz. Kümelenmemiş dizinlerde sorgumuzun koşul bölümünde sıklıkla kullandığımız sütunlardan oluşturulmalıdır.

Clustered ve Non-Clustered index türleri arasında en yaygın olarak kullanılan index türleridir. Diğer index türlerine kısaca değinecek olursak;

Composite (Birleşik): Indexler birden fazla sütunu içeren index türleridir. Bu tür indexler, sorguların performansını artırabilir çünkü sorgular genellikle birden fazla sütunu içerir. Birleşik indexler, bu sütunlardaki verilere göre sıralanır ve aranabilir.

Unique(Benzersiz): Indexler, index içindeki değerlerin benzersiz olmasını zorlar. Bu, genellikle bir PRIMARY KEY constraint’ini desteklemek veya bir sütunun benzersiz olmasını sağlamak için kullanılır.

Küme (Clustered) Indexler: Bu tür index, verilerin fiziksel sıralama düzenine göre saklandığı bir yapıdır. Bir tablo üzerinde yalnızca bir küme index olabilir. Küme index, genellikle PRIMARY KEY constraint’ini desteklemek için kullanılır.

Covering (Kapaklı): Indexler, bir sorgunun tamamını kapsayan sütunları içerir. Sorguları daha hızlı hale getirmek için kullanılır çünkü sorgu sonuçlarını elde etmek için ana tabloya erişim gereksinimini azaltır.

Index Nasıl Oluşturulur?

Indexlerin genel yapısını ve türlerini inceledikten sonra şimdi nasıl oluşturmalıyız bunu inceleyelim, index oluşturmak için SQL Server Management Studio üzerinden örnek olarak AdventureWorks2019 veritabanını kullanarak index oluşturmaya çalışalım.

İlk adım olarak veritabanımızda index ihtiyacının var olduğunu düşündüğümüz tablomuzun içine gelerek index seçeneği üzerinde sağ tıklayıp New Index ve ardından Non-Clustered Index seçeneğine tıklıyoruz.

Resim-2

Açılan ekrandan bir column(sütun) eklemek için Add seçeneğine tıklıyoruz.

Resim-3

Index’e eklemek için bir sütuna ihtiyaç duyarız. DepartmentID alanını seçerek Ok butonuna tıklıyoruz.

Resim-4

Bir sonraki adımda New Index ekranında yeni eklediğimiz sütun gözükmektedir. Bundan sonrasında index’i oluşturmak için OK seçeneğine tıklamak gerekmektedir.

Resim-5

Yukarıda görmüş olduğunuz gibi index oluşturma işlemini manuel olarak gerçekleştirebiliriz, aynı zamanda da manuel gerçekleştirdiğimiz bütün işlemleri script yazarak da oluşturabiliriz.

USE [AdventureWorks2019]

GO

CREATE NONCLUSTERED INDEX [NonClusteredIndex-20231127-160210] ON [HumanResources].[Department]
(
[DepartmentID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF)

GO

Bu yazımda sizlere Index kavramının ne olduğunu, çalışma mantığını, türlerini ve index oluşturmayı açıklamaya çalıştım umarım sizlere fayda sağlamasını dilerim.

Kaynaklar

Resim-1: https://s33162.pcdn.co/wp-content/uploads/2017/05/word-image-15.png (SQL Server Dizin Mimarisi-Cem Doğan)

https://medium.com/trendyol-tech/sql-server-index-architecture-b320999547c4

https://www.veritabani.gen.tr/2016/11/17/sql-serverda-index-kavrami-performansa-etkisi/

https://www.spotlightcloud.io/blog/when-to-use-clustered-or-non-clustered-indexes-in-sql-server

https://www.c-sharpcorner.com/UploadFile/8af593/index-in-sql-server/

Leave a Reply

Your email address will not be published. Required fields are marked *