SQL Server’da Clustered ve Non-Clustered Indexler arasındaki Fark Nedir? – Tasarım Kodlama
SQL SQL Server

SQL Server’da Clustered ve Non-Clustered Indexler arasındaki Fark Nedir?

INDEX’ler, SQL Server’da sorgulama işlemini hızlandırmak için kullanılır ve bu da yüksek performans sağlar. Ders kitaplarındaki dizinlere benzerler. Ders kitaplarında, belirli bir bölüme gitmeniz gerekiyorsa, dizine gidin, bölümün sayfa numarasını bulun ve doğrudan o sayfaya gidin. Dizinler olmadan, istediğiniz bölümü bulma işlemi çok yavaş olurdu.

Aynı şey veritabanlarındaki dizinler için de geçerlidir. Dizinler olmadan, bir DBMS’nin istenen sonuçları almak için tablodaki tüm kayıtlardan geçmesi gerekir. Bu işleme tablo tarama denir ve son derece yavaştır. Öte yandan, dizinler oluşturursanız, veritabanı önce bu dizine gider ve sonra karşılık gelen tablo kayıtlarını doğrudan alır.

SQL Server’da iki tür Dizin vardır:

  1. Clustered Index
  2. Non-Clustered Index

Clustered Index

Clustered Index(Kümelenmiş dizin), verilerin bir tabloda fiziksel olarak depolanma sırasını tanımlar. Tablo verileri yalnızca bir yolla sıralanabilir, bu nedenle tablo başına yalnızca bir kümelenmiş dizin olabilir. SQL Server’da, birincil anahtar kısıtlaması o sütunda otomatik olarak kümelenmiş bir dizin oluşturur.

Hadi bir bakalım. İlk olarak, aşağıdaki kodu çalıştırarak “okul” içinde bir “ogrenci” tablosu oluşturun veya gerçek verilerinizi kullanıyorsanız veritabanınızın tamamen yedeklendiğinden emin olun:

Burada “öğrenci” tablosunda “id” sütununda birincil anahtar kısıtlaması belirledik. Bu, otomatik olarak “id” sütununda clustered (kümelenmiş) bir dizin oluşturur. Belirli bir tablodaki tüm dizinleri görmek için “sp_helpindex” saklı yordamını yürütün. Bu saklı yordam, tablonun adını parametre olarak kabul eder ve tablonun tüm dizinlerini alır. Aşağıdaki sorgu, öğrenci tablosunda oluşturulan dizinleri alır.

Sorgu sonucu aşağıdaki gibi olacaktır.

clustered index, non-clustered index

Çıktıda sadece bir endeks görebilirsiniz. Bu, “id” sütunundaki birincil anahtar kısıtlaması nedeniyle otomatik olarak oluşturulan dizindir.

Tablo dizinlerini görüntülemenin başka bir yolu da “Object Explorer-> Databases-> Database_Adı-> Tables-> Table_Adı -> Indexes” e gitmektir. Referans için aşağıdaki ekran görüntüsüne bakın.

clustered index

Bu kümelenmiş dizin, kaydı öğrenci tablosunda “id” artan düzeninde saklar. Bu nedenle, eklenen kayıt 5 kimliğine sahipse, kayıt ilk satır yerine tablonun 5. satırına eklenir. Benzer şekilde, dördüncü kaydın kimliği 3 ise, dördüncü satır yerine üçüncü satıra eklenir. Bunun nedeni, kümelenmiş dizinin, dizinlenmiş sütuna, yani kimliğe göre depolanan kayıtların fiziksel sırasını korumak zorunda olmasıdır. Bu sıralamayı çalışırken görmek için aşağıdaki komut dosyasını yürütün:

Yukarıdaki komut dosyası, öğrenci tablosuna on kayıt ekler. Burada kayıtların “id” sütunundaki değerlerin rastgele sırada eklendiğine dikkat edin. Ancak id sütunundaki varsayılan kümelenmiş dizin nedeniyle, kayıtlar fiziksel olarak “id” sütunundaki değerlerin artan düzeninde depolanır. Öğrenci tablosundan kayıtları almak için aşağıdaki SELECT deyimini yürütün.

Kayıtlar aşağıdaki sırayla alınacaktır:

sql örnekleri

Clustered Index Oluşturma

Kendi özel dizininizi ve varsayılan kümelenmiş dizini oluşturabilirsiniz. Bir tabloda yeni bir kümelenmiş dizin oluşturmak için önce önceki dizini silmeniz gerekir.

Bir dizini silmek için “Object Explorer-> Databases-> Database_Name-> Tables-> Table_Name -> Indexes” e gidin. Silmek istediğiniz dizine sağ tıklayın ve DELETE seçin. Aşağıdaki ekran görüntüsüne bakın.

Şimdi, yeni bir clustered index (kümelenmiş Dizin) oluşturmak için aşağıdaki komut dosyasını yürütün:

Kümelenmiş dizin oluşturma işlemi, bir istisna dışında normal bir dizine benzer. Kümelenmiş dizin ile, “INDEX” ten önce “CLUSTERED” anahtar sözcüğünü kullanmanız gerekir.

Yukarıdaki komut dosyası, öğrenci tablosunda “INDEX_OGRENCI_CINSIYET_ISIM” adlı kümelenmiş bir dizin oluşturur. Bu dizin “cinsiyet” ve “isim” sütunlarında oluşturulur. Birden fazla sütunda oluşturulan bir dizine “bileşik dizin” denir.

Yukarıdaki indeks önce tüm kayıtları cinsiyetin artan sırasına göre sıralar. Cinsiyet iki veya daha fazla kayıt için aynı ise, kayıtlar “isim” sütunlarındaki değerlerin azalan düzeninde sıralanır. Tek bir sütunda da kümelenmiş bir dizin oluşturabilirsiniz. Şimdi öğrenci tablosundan tüm kayıtları seçerseniz, kayıtlar aşağıdaki sırayla alınır:

Non-Clustered Index

Non-Clustered Index (Kümelenmemiş bir dizin), tablodaki fiziksel verileri sıralamaz. Aslında, kümelenmemiş bir dizin bir yerde depolanır ve tablo verileri başka bir yerde depolanır. Bu, kitap içeriğinin bir yerde ve dizinin başka bir yerde bulunduğu bir ders kitabına benzer. Bu, tablo başına birden fazla kümelenmemiş dizine izin verir.

Burada tablonun içinde verilerin kümelenmiş bir dizine göre sıralanacağından bahsetmek önemlidir. Ancak, kümelenmemiş dizin verileri belirtilen sırada saklanır. Dizin, dizinin oluşturulduğu sütun değerlerini ve sütun değerinin ait olduğu kaydın adresini içerir.

Dizinin oluşturulduğu bir sütuna karşı sorgu verildiğinde, veritabanı önce dizine gider ve tablodaki karşılık gelen satırın adresini arar. Daha sonra bu satır adresine gidecek ve diğer sütun değerlerini getirecektir. Bu ek adım nedeniyle, kümelenmemiş dizinler kümelenmiş dizinlerden daha yavaştır.

Non-Clustered Index Oluşturma

Kümelenmemiş bir dizin oluşturma sözdizimi, kümelenmiş dizine benzer. Ancak, kümelenmemiş dizin durumunda, “CLUSTERED” yerine “NONCLUSTERED” anahtar kelimesi kullanılır. Aşağıdaki betiğe bir göz atın.

Yukarıdaki komut dosyası, öğrenci tablosunun “isim” sütununda kümelenmemiş bir dizin oluşturur. Dizin, artan düzende ada göre sıralar. Daha önce söylediğimiz gibi, tablo verileri ve dizin farklı yerlerde saklanacaktır. Tablo kayıtları, varsa kümelenmiş bir dizine göre sıralanır. Dizin tanımına göre sıralanır ve tablodan ayrı olarak saklanır.

Non-clustered indexde alanlar satırların adresleri ile birlikte tutulmaktadır. Aşağıdakine benzer şekilde ayrı bir yerde indexlenmiştir. İSİM alanına göre yapılan aramalarda bu index kontrol edilip ilgili adrese uygun tüm kayıtlar asıl tablodan çekilir.

 

Kaynak: https://www.sqlshack.com/what-is-the-difference-between-clustered-and-non-clustered-indexes-in-sql-server/

 

Yorum bırak