30 Mayıs 2011 Pazartesi

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

27 Mayıs 2011 Cuma

İPhone Uygulamaları Geliştirme - SDK Kurulumu


iPhone cihazlarında uygulama geliştirmek için ön koşul bir Mac bilgisayar almaktır. SDK’nın içerdiği araçların (XCode, Interface Builder, iPhone Simulator) kullanılabilmesi için alacağınız Mac bilgisayar mutlaka Intel işlemcili olmalıdır. Mac bilgisayarımızı aldıktan sonra ikinci işimiz “Apple Developer” hesabı oluşturmaktır. Developer hesabını aşağıdaki adrese girip oluşturduktan sonra “Dev Center” web sitesinden XCode ve IOS SDK’yı indirmeye sıra gelir.

http://developer.apple.com/devcenter/ios/program/start/register/
IOS SDK dosyası “.dmg” uzantılıdır. DMG uzantılı dosyaları “.iso” uzantılı disk imaj dosyalarına benzerler. Mac OS bilgisayarlarda bu dosyaları herhangi bir kurulum yapmadan unmount edebilmeniz mümkündür. SDK Kurulumu sonrasında Mac bilgisayarımızda “Developer” dizini oluşmaktadır. XCode aracını çalıştırmak için Finder ile Macintosh HD’ye ulaşıp, Developer/Application dizinindeki uygulamayı çalıştırabilir veya masa üstündeki çekiç figürlü XCode ikonuna tıklayabiliriz.

1
Tıkladıktan sonra karşımıza çıkan XCode proje/uygulama yönetim aracı ekran görüntüsü aşağıdaki gibidir.

2
Bundan sonrasında ilk “Hello World” uygulamamızı yazıyoruz.
Deniz KILINÇ

25 Mayıs 2011 Çarşamba

SQL’de tanımlanan Job’un sonucuna göre mail bildirimini aktif hale getirmek.

SQL Server üzerinde tanımlanmış job’ların sonucunu (başarılı mı hatalı mı?), tanımlanmış kişilere mail atılması için sql üzerinde bazı tanımlamalar yapılması gerekmektedir. Bu makalemizde mail tanımlamaları nerelerden nasıl yapılır onlara deyineceğiz.

SQL sunucuya management studio ile bağlandıktan sonra, “Managament” seçeneğinin içerisinde “Database Mail” üzerine sağ tuşla tıklayarak “Configure Database Mail” seçeneğini seçiyoruz. (Resim-1)
1Resim-1
Bir sonraki ekranda karşımıza çıkan; “Database Mail Configuration Wizard” ekranında “Next” diyerek sonraki aşamaya geçiyoruz.
Bir sonraki ekranda karşımıza çıkan; “Set up Database Mail by performing the following tasks” yazan hali hazırda seçili seçeneği değiştirmeyerek yeniden “Next” tuşuna basıyoruz. (Resim-2)
2
                                                                     Resim-2

Bir sonraki karşımıza gelen ilk ekranda, öncelikle “Profile name” kısmında anlamlı bir isim verilmesi gerekmektedir. Daha sonra “Add” tuşuna basarak yeni hesap tanımlama ekranına geçiyoruz. Burada “New Account” diyerek son ekran olan “New Database Mail Account” ekranına geliyoruz. Burada tanımlanacak hesap SQL sunucunun maili göndermek için kullanacağı mail sunucu ve hesap bilgileridir. Gelen uyarı mailleri burada tanımlanacak adresten gelecek ve yazılan isim görünecekktir. (Resim-3)

“Outgoing Mail Server” ayarlarını resimdekine (Resim-3) benzer şekilde ayarlamamız gerekmektedir. Buradaki ayarlar müşteri mail sunucusu kullanılıyor ise farklılık gösterecektir.

“SMTP Authentication” kısmında ise ilgili hesabın kullanıcı adı ve şifresi girilmelidir. Alternatif olarak SQL sunucu ve mail sunucu aynı networkde ise Anonymous authentication seçeneği seçilerek kullanıcı adı ve şifre girmek gerekmeyebilir.(Resim-3)

Son olarak “Ok” tuşuna basarak yeni hesabımızı yaratmış olacağız.(Resim-3)
3
Resim-3
Bir sonraki ekranda, yarattığımız hesabı “SMTP accounts” kısmında gördükten sonra yine “Next” tuşuna basarak işleme devam ediyoruz. (Resim-4)
4
Resim-4
Bir sonraki ekranda ise yarattığımız hesabın karşında bulunan “Default Profile” seçeneğinde “Yes” i seçerek, önündeki Public kutucuğuna çek işareti koyuyoruz. Daha sonra “Nex”t tuşuna basarak devam ediyoruz. Bir sonraki ekranda da Next deyip diğer ekrana geçiyoruz. Son ekranda Finish diyerek verilen işlemleri gerçekleştirmek üzere diğer ekrana geliyoruz.

Bu ekranda ise Success yazısını gördüğümüzde hesap ve profilimiz başarıyla oluşturulmuş demektir. Close tuşuna basarak bu ekranı kapatıyoruz. (Resim-5)

5
Resim-5
Sonra yine “SQL Server Agent” altında “Operators” seçeneği üzerine sağ tuşla tıklayarak açılan menüden “New Operator...” seçeneğini seçiyoruz. Burada dikkat edilmesi gereken nokta “SQL Server Agent” servisinin çalışır durumda olması gerekmektedir. Kurulumda Default olarak disable gelir. (Resim-6)
7
Resim-6
Yeni açılan ekranda mail atılacak kişi/kişileri tanımlıyoruz. Name kısmına alıcı adı Email name kısmına ise alıcının adresini yazıyoruz ve Ok tuşuna basarak işlemi tamamlıyoruz. (Resim-7)

8
Resim-7
Ana ekrandan SQL Server Agenta sağ tuşla tıklayarak Properties kısmını seçiyoruz.

Açılan ekrana ise solda “Alert System” seçeneğini seçerek sağ ekranda bulunan Enable mail profile kutucuğunu çekliyoruz. Daha sonra “Mail system” kısmından “Database Mail” seçeneğini seçerek, alttaki Mail profile kısmında ise yarattığımız mail profilinin adını seçiyoruz. (Resim-8)

9
Resim-8
Son olarak yine SQL içerisinde “Jobs” kısmında daha önceden yaratmış olduğumuz backup Jobın üzerine gelerek “properties” kısmını seçiyoruz. Bu ekran ise Notifications kısmını seçerek E-mail seçeneğini çekleyerek açılan seçenekten mailin gönderileceği hesabı seçiyoruz. Hemen yandaki alandaki 3 seçenekte ise istediğimiz konfigürasyona göre ilgili seçeneği seçiyoruz. (Resim-9) Bunlar:

- When the job fails: Yanlızca Job çalışarak hata durumuyla(fail) sonuçlanmışsa mail at.

- When the job succeeds:Yanlızca Job çalışarak başarılı bir şekilde tamamlandıysa mail at.

- When the job completes: Sonuca bakılmaksızın Jobın çalışması bittiğinde sonuçla birlikte mail at

10
Resim-9
Bora ENGİN