Sql Server Index Nedir, Kullanımı Nasıldır ?
- Fazlı Keleş

- 29 Oca 2021
- 3 dakikada okunur
Güncelleme tarihi: 26 Ağu 2023
Sql Serverda verilerimizi tablolar halinde tutarız ve yeri geldiğinde tablolarımızdaki verilere ulaşmak isteriz. Tablolarımız küçük iken bu isteğimiz saniyeler hatta saliseler içerisinde hallolur. Ama tablolarımız büyüdükçe bu işlemin süresi artacaktır hele ki içerisinde milyonlarca verinin bulunduğu tablolarda bu işlem çok daha uzun sürecektir. Mesela çok büyük bir eczanemiz olduğumuzu düşünelim ve veritabanımızda milyonlarca ilacın bilgileri var. Şimdi biz satacak olduğumuz her ilacın barkodunu okuttuğumuzda veritabanı o bilgiyi bulup sisteme fiyatını ve bazı bilgilerini yazacak. Eğer index kullanmamışsak her bir ilaç için 4-5 dakika (veri büyüklüğüne göre değişken) bekleyemeyiz yoksa bütün gün birkaç müşteri ile anca ilgilenebiliriz.
Sorunumuzu anladığımıza göre şimdi çözüme yani indexlere geçiş yapabiliriz. Index olmadan önce veritabanımız gidip bütün verileri dolaşıyordu tabloya eklenme sırasına göre. Ve bulana kadar bu şekilde gidiyordu. Ancak biz index ayarlaması yaptığımız zaman veriye çok daha kolay erişebilecek. Çünkü artık verilerimize index ekleyeceğiz yani bir sıraya bir düzene sokacağız ki bütün tabloyu araştırmadan çok kısa bir sürede istediğimiz veriye ulaşabilelim.
O zaman lafı daha fazla uzatmadan hemen örnek bir tablo oluşturayım. Burda hiçbirşey anlamanıza gerek yok sadece tablo oluşturup içerisine veri girişi yapıyoruz stored procedure ile sadece kopyala yapıştır yapsanız yeterli. İleride stored procedure ile ilgili yazımda da bunu detaylı olarak anlatıyor olacağım.
Tablo Oluşturma
CREATE TABLE TBL1
(
ID INT PRIMARY KEY IDENTITY(1,1),
NAME_ VARCHAR(50),
SURNAME VARCHAR(50),
GENDER VARCHAR(1),
BIRTHDATE DATE,
NAMESURNAME VARCHAR(100)
)Bu kod bloğunu Sql'e yapıştırıp "Execute" ettikten sonra tablomuzu oluşturmuş oluyoruz, şimdi ise bunun içini veri ile dolduralım ki indexin değerini anlayalım.
CREATE PROC [dbo].[SP_GENERATOR]
AS
BEGIN
DECLARE @NAME_ AS VARCHAR(100)
DECLARE @SURNAME AS VARCHAR(100)
DECLARE @GENDER AS VARCHAR(1)
DECLARE @BIRTHDATE AS DATE
DECLARE @NAMESURNAME AS VARCHAR(100)
DECLARE @I AS INT =1
WHILE @I <100000
BEGIN
SET @NAME = 'ISIM' + CAST(CEILING(RAND()*10000) AS VARCHAR)
SET @SURNAME = 'SOYISIM' + CAST(CEILING(RAND()*10000) AS VARCHAR)
SET @GENDER = FLOOR(RAND()*2)
SET @BIRTHDATE = DATEADD(DAY,CEILING(RAND()*10000),'19500101')
SET @NAMESURNAME = @NAME+@SURNAME
INSERT INTO TBL1 ([NAME], [SURNAME], [GENDER], [BIRTHDATE], [NAMESURNAME])
VALUES (@NAME,@SURNAME,@GENDER,@BIRTHDATE,@NAMESURNAME)
SET @I+=1
END
ENDBu kod bloğunu da kopyala-yapıştır yapıyoruz ve ardından bu kodu çalıştırdığımız zaman prosedürümüz hazır hale geliyor. En son "EXECUTE SP_GENERATOR" kodunu yazıyoruz ve her şey hazır hale geliyor. Elimizde artık içi veri ile dolu bir tablo oluyor. "SELECT * FROM TBL1" komutu ile tablomuzu kontrol edelim.

Gördüğümüz gibi tablomuzda 99.999 adet verimiz var. Aslında bu çok büyük bir tablo değil ama indexi anlamak için yeterli. Şimdi herhangi bir index düzenlemesi yapmamışken bir sorgu gönderelim ve bu iş için arka planda Sql neler yapıyor görelim. Rasgele bir tarih yazalım ve bu tarihte doğan kişiyi getirmesini isteyelim Sqlden. Bu arada sizin sonucunuz farklı olabilir veya sonuç çıkmayabilir çünkü prosedürümüz rasgele tarihler atıyor tarihi değiştirirseniz bir sonuç alabilirsiniz.
SET STATISTICS IO ON
SELECT * FROM TBL1 WHERE BIRTHDATE = '1970-07-21'Bu arada "SET STATISTICS IO ON" komutu bize arka planda okunan page sayısı gibi bir sürü bilgiyi gösteren çok yararlı bir komuttur.

Sonucu görmek için Result sekmesinin sağ tarafında yer alan Messages kısmına geçmemiz lazım ve burda yazan logical reads kısmına odaklanalım. Okunan sayfa sayısı "854" yani biz bu sonucu görene kadar 854 tane sayfa okumuşuz. Çünkü herhangi bir düzene göre değil baştan bu sonucu bulana kadar okuma yaptık. Şimdi index ekleyelim ce sonuçlara tekrar bakalım.
CREATE NONCLUSTERED INDEX IX_BIRTHDATE ON TBL1
(
BIRTHDATE
)
GOIndex oluşturmak bu kadar basit aslında :) Şimdi bu kod parçacığında "BIRTHDATE" kolonumuza index tanımlamış olduk yani bir sıraya göre dizdik. Peki biraz önce 854 adet page okuyan kodumuzun aynısını yazalım acaba bir değişikil oldu mu kontrol edelim.
SET STATISTICS IO ON
SELECT * FROM TBL1 WHERE BIRTHDATE = '1970-07-21'
Gördüğümüz gibi biraz önce 854 adet okunan page sayısı ufacık bir index ayarlamasıyla beraber 5 e düştü. Verilerimiz büyüdükçe bu oran çok daha fazla artıyor. Ama şimdi biz sadece "BIRTHDATE" kısmına index koyduk yani sorgularımızda sadece "WHERE BIRTHDATE="---" olduğu zaman index kullanımı mantıklı olacaktır. Şöyle düşünelim; Elimizde bir telefon rehberi var ve bu rehber isme göre sıralanmış biz bir ismi aradığımızda mesela Fazlı ismini arıyoruz hızlıca bulabiliriz çünkü sıralama isme göre yapılmış. Ama biz bu isme göre sıralanmış rehberde numaraya göre arama yaparsak numaralar sıralı olmadığı için saatlerde uğraşıyor olabiliriz :) Buradaki mantık tamamen aynı şekilde işliyor.
Bu yazımda "Index" kavramına basit bir giriş yaptım. Indexler bu kadar küçük kısa bir konu değil :) İndex bakımı, planlaması vb konuları var bu indexin. Onları da ilerleyen zamanlarda yazıyor olacağım. Indexsiz kalmayın :)
İyi günler, İyi çalışmalar.



Yorumlar