Ana içeriğe atla

Heap, Clustered İndeks ve Nonclustered İndeks Data Yapıları - Bölüm 2(Clustered İndeks Mimarisi)


3. Clustered İndeks Mimarisi

SQL Server’da, indeksler B tree içinde düzenlenirler. B treedeki indeks içindeki her page index node olarak adlandırılır. B-treenin en tepedeki nodu root node olarak adlandırılır. İndeksin en alt seviyesindeki nodlar leaf node olarak adlandırılır. Root ve leaf nodlar arasındaki herhangi bir indeks seviyesi ortak olarak intermediate seviyededir. Clustered indekste leaf nodelar tablo altındaki data pageleri içerirler. Root ve ara seviyedeki nodlar indeks satırlarını tutan indeks pageleri içerirler. Her indeks satırı bir anahtar değeri ve ara seviye sayfa göstergesi veya leaf level data row göstergesi içerir. Her seviye içindeki pageler doubly-linked list içinde bağlıdırlar.

Veri zincirindeki pageler ve onun içindeki satırlar clustered indeks anahtar değerine göre sıralanır. Tüm INSERT işlemleri, diğer satırların arasında anahtar değerine uygun satıra yapılır. B-tree için page collectionlar, sys.system_internals_allocation_units’ deki page pointerlar tarafından bağlıdır.

Clustered indeks için, sys.system_internals_allocation_units içindeki root_page kolonu clustered indeksin en tepesini gösterir. Server dizideki anahtar değerine uyan satırı bulmak için indeksi bir alt satıra indirir. Anahtar sırasını bulmak için, SQL Server indeksi sırada hareket ettirir ve başlangıç anahtar değerini bulur ve sonra previous veya next pointerları kullanarak data pageleri tarar. Data page zincirindeki ilk sayfayı bulmak için, indeksin root nodundan en soldaki pointerları takip eder.

Şekil 1’ teki partitiondaki clustered indeks yapısını gösteriyor.

1

SQL Server’ın clustered indeksi nasıl oluşturduğunu görmek için bir tablo yaratıp kayıt girişi yapalım.


Create Table EmpTable2

(  EmpId Int,

   EmpName Varchar(8000)      )

Insert Into EmpTable2 Values (4, Replicate ('d',2000))

GO

Insert Into EmpTable2 Values (6, Replicate ('f',2000))

GO

Insert Into EmpTable2 Values (1, Replicate ('a',2000))

GO

Insert Into EmpTable2 Values (3, Replicate ('c',2000))

GO

Select EmpID From EmpTable2

2

 

 

 

Sonuca göre kayıtlar yine giriş yaptığımız sıra ile görüntülüyor. DBCC Ind komutuyla page yapısına bakalım:

DBCC TRACEON (3604)

GO

Declare @DBID Int, @TableID Int

Select @DBID = db_id(), @TableID = object_id('EmpTable2')

DBCC ind(@DBID, @TableID, -1)

GO

3

Aslında yukarıdaki sorgulardan daha fazla kolon dönüyor ancak biz üç kolonu inceleyeceğiz.

PagePID: Fiziksel sayfa numarasıdır. Bizim yarattığımız koşullarda veriyi saklayan üç page bulunuyor.
IndexID: İndeks tipini gösterir.
0 – DataPage
1 - Clustered Index
2 - Veya daha büyükse Index page (Non-Clustered Index ve ordinary index)

PageType: Hangi türde veri sakladığını belirtir.
10 - IAM (Index Allocation MAP)
1 – DataPage
2 - Index Page

Şimdi de EmpId kolonuna Unique Clustered Index oluşturarak page yapılarına nasıl etki ettiğini inceleyelim:

CREATE UNIQUE CLUSTERED INDEX EmpTable2_EmpIndex

ON EmpTable2 (EmpID)

GO

Select EmpID From EmpTable2

4

Şimdi DBCC Ind (dbid, tabid, -1) komutunu çalıştırıp sonuca bakalım:

DBCC TRACEON (3604)

GO

Declare @DBID Int, @TableID Int

Select @DBID = db_id(), @TableID = object_id('EmpTable2')

DBCC ind(@DBID, @TableID, -1)

GO

5

MSSQL, indeks için “page allocation details“ bilgisi içeren page (pagetype = 10) yaratır.
Şimdi 78 ve 118 numaralı pageleri inceleyelim:

DBCC TRACEON (3604)

GO

DBCC page(12, 1, 78, 3)

GO

Sonuç :

Record Type = PRIMARY_RECORD

EmpId = 1                           

mpName = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa…….

 

Record Type = PRIMARY_RECORD     

EmpId = 3        

EmpName = ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

ccccccccccccccccccccccccccccccccccc…….

Yukarıdaki sonuca göre biz kayıtları sırasız bir şekilde eklememize rağmen, datapage’de kayıtlar sıralı bir şekilde gösteriliyor. Bir tabloya clustered indeks oluşurulursa datapagelerde fiziksel sıralama yapılır, indeks kolon baz alınarak fiziksel olarak sıralanır.

Şimdi tabloya bazı kayıtlar daha ekleyelim:

INSERT INTO EmpTable2 VALUES (10, Replicate ('j',4000))

INSERT INTO EmpTable2 VALUES (2, Replicate ('b',4000))

INSERT INTO EmpTable2 VALUES (5, Replicate ('e',4000))

INSERT INTO EmpTable2 VALUES (8, Replicate ('h',4000))

INSERT INTO EmpTable2 VALUES (9, Replicate ('i',4000))

INSERT INTO EmpTable2 VALUES (7, Replicate ('g',4000))

DBCC TRACEON (3604)

GO

Declare @DBID Int, @TableID Int

Select @DBID = db_id(), @TableID = object_id('EmpTable2')

DBCC ind(@DBID, @TableID, -1)

GO

8












Yukarıdaki tabloda gösterilen, page allocation detayını içeren page detayına bakalım:

DBCC TRACEON (3604)

GO

dbcc page(12, 1, 80, 3)

GO

Sonuç:

IAM: Single Page Allocations @0x6212C08E

Slot 0 = (1:78)                     

Slot 1 = (1:89)                     

Slot 2 = (1:118)

Slot 3 = (1:120)                    

Slot 4 = (1:174)                    

Slot 5 = (1:45)

Slot 6 = (1:79)                     

Slot 7 = (1:94)

Şimdi indeks kaydına bakalım :

DBCC TRACEON (3604)

GO

dbcc page(12, 1, 118, 3)

GO

9

Clustered Index kullanımı WHERE cümlesinde BETWEEN kullanıldığı zaman, verinin sıralanırken ve çok sayıda kayıt alınırken çok kullanışlıdır. Çünkü clustered indeksin leaf seviyesi veridir. Bu da çok sayıda I/O kaydetmek için kullanılacaktır. Yani clustered indeks kullanımı veri sıralama sorgularında en iyi çözümdür.

Referanslar
1. http://msdn.microsoft.com

Serap PARLAK

Yorumlar

Bu blogdaki popüler yayınlar

UML ve Modelleme – Bölüm 4 (Class (Sınıf) Diyagramları)

Bir önceki makalemizde UML modellemede kullanılan ilk diyagram olan Use Case diyagramını incelemiştik. Bu makalemizde nesne tabanlı programlamada kullanılan sınıflar ve sınıfların arasındaki ilişkileri modelleyebileceğimiz diyagramlar olan Class(Sınıf) diyagramlarını inceleyeceğiz. UML’de sınıflar, nesne tabanlı programlama mantığı ile tasarlanmıştır. Sınıf diyagramının amacı bir model içerisinde sınıfların tasvir edilmesidir. Nesne tabanlı uygulamada, sınıfların kendi özellikleri (üye değişkenler), işlevleri (üye fonksiyonlar) ve diğer sınıflarla ilişkileri bulunmaktadır. UML’de sınıf diyagramlarının genel gösterimi aşağıdaki gibidir. Şekil 1. Class Diyagram Şekil1’de görüldüğü üzere bir dikdörtgeni 3 parçaya bölüyoruz. En üst bölüm sınıf adını, orta kısım özellik listesini (üye değişkenler) ve en son kısım, işlev listesini (üye fonksiyonlar) göstermektedir. Çoğu diyagramlarda alt iki bölüm çıkarılır. Genelde tüm özellik ve işlevler gösterilmemektedir. Ama

Yazılım Maliyet Tahmineleme Tecrübeleri

Yazılım mühendisliğinde maliyet hesabı her zaman problem olmuştur. "Bu iş kaç Adam/Gün tutar?" sorusuyla sıkça karşılaşıyoruz. Adam/gün veya Adam/ay ölçütleri bir kaynağın/kişinin belirtilen zaman dilimindeki iş gücü anlamına gelir. Tabi bu noktada yine kafa karışıklıkları başlar. 6 A/G'lik bir işi hızlandıralım diye 2 kişi ile yapmaya çalışsak ve kaynak/kod, modül, altyapı, insan vb. her bir şeyi bir kenara bıraksak, matematiksel basit formülle 6/2=3 A/G'de biter? Gerçek hayat böyle değil, öncelikle bunu anlamamız lazım. Hep şu örnek verilir; "Aynı bebeği 2 kadın birlikte daha kısa sürede doğurur mu?" Eğer bunun cevabı "Evet" ise (veya bir gün böyle bir durum ortaya çıkarsa), yazımı değiştirmem gerekecek:) Mevzu gerçekten derin...Maliyet hesabı; bulunduğunuz firmanın yazılım süreçlerini hangi methodlarla uyguladığına, ilgili işin o dönemdeki aciliyetine, (şirket yönetiminin baskısına:)) vb. bir çok duruma bağlı olabilir. Örneğin; bizim firmada e

UML ve Modelleme – Bölüm 3 (Use Case Diyagramlar)

Önceki iki makalemizde ( 1 , 2 ) UML’e genel olarak değinip ve modellemede kullanacağımız dokuz diyagram hakkında bilgiler vermiştik. Bu makalemizde Use Case diyagramından detaylı bahsedeceğiz. Öncelikle, genel Use case diyagramının tanımını hatırlayalım. “Bir kullanıcı ve bir sistem arasındaki etkileşimi anlatan senaryo topluluğudur.” Ivar Jacobson Senaryo tanımı için der ki: “Aktörle sistem arasında gerçekleştirilen, sonucunda aktöre farkedilir getirisi/ faydası oluşan etkileşimli diyalogdur. ” UML Use Case Diyagramları  sistemin işlevselliğini açıklamak amacıyla kullanılır. Sistemin birbirinden ayrı özelliklerinin detaylarını göstermekten ziyade, Use Case Diyagramlar, tüm mevcut işlevselliği göstermek için kullanılabilir. Buradaki en önemli noktalardan biri,   Use Case Diyagramlar temelde sequence diyagram ve akış diyagramlarından farklıdır. Use Case diyagramlar dört ana elemandan oluşmaktadır. Aktörler , Sistem (Proje kapsamını belirtir) , Use Caseler ve bunlar ara