Makale Özeti

SQL Server 2005’de İndekslerin Planlanması ve Oluşturulması Veri miktarı arttıkça, veriye ulaşmak için indeks oluşturmak performans açısından çok faydalıdır. Ancak zaman içerisinde verilerin dağılımı değiştikçe tanımlanan indekslerin de bakımının yapılması veya indekslerin yeniden oluşturulması gerekmektedir.

Makale

 

Veri miktarı arttıkça, veriye ulaşmak için indeks oluşturmak  performans açısından çok faydalıdır. Ancak zaman içerisinde verilerin dağılımı değiştikçe tanımlanan indekslerin de bakımının yapılması veya indekslerin yeniden oluşturulması gerekmektedir.

 

SQL Server 2000 de olduğu gibi SQL Server 2005’de de indeksler clustured ve non-clustered olmak üzere ikiye ayrılmaktadır. SQL Server 2005’de indekslere yeni yeteneklerde kazandırılmış olmakla birlikte yeni indeks tipleri de eklenmiştir. Yeni eklenen ALTER INDEX T-SQL komutu indekslerin yeniden oluşturulması, iptal edilmesi, etkisiz hale getirilmesi, yeniden düzenlenmesi ve tekrar organize edilmesi gibi opsiyonlara olanak sağlar. Bu komut,  bir indeksi yeniden düzenlemek için onu silerek tekrar oluşturma gerekliliğini ortadan kaldır. SQL Server 2005 indeksleri onlar kullanımda iken geliştirmemize, düzenlememize olanak sağlar (online indeksler). Örneğin bir kullanıcı bir tablodaki bilgileri okurken,  aynı zamanda o tablo üzerinde clustered-index oluşturabiliriz.

 

Daha önceki SQL versiyonları indeks operasyonları bitinceye kadar tabloya erişimi engellerdi. Çoklu CPU’ye desteği SQL Server 2005’te otomatik olarak gerçekleşir.

 

Max degree of parallelism seçeneği ile birlikte indeksin bakımı sırasında bu işleme ayrılacak maksimum CPU sayısı belirlenebilir. İndeks drop/alter/create etme operasyonlarında  çoklu CPU sıralama ve tarama işlemlerinin paralel yapılması avantajının sağlanmasına rağmen,  indeks yaratma (creating), rebuilt etme ve drop etme işlemleri hala bu versiyonda da kaynak harcayıcı olabilir. Bu nedenle CREATE INDEX, ALTER INDEX, DROP INDEX  T-SQL komutları çalıştırıldığında, MAXDOP query hint’i kullanarak işlemci sayısını sınırlayabiliriz.

MAXDOP =0 yaparsak kullanabileceği maksimimum işlemciyi kullanır.Eğer MAXDOP parametresini belirtmezsek, kullanılacak maksimum işlemci sayısını  max degree of parallelism konfigürasyon ayarı belirler.

 

 

SQL Server 2005’de index kullamında kayıt kilitleme için iki tane yeni seçenek sunulmuştur.

ALLOW_PAGE_LOCKS ve ALLOW_ROW_LOCKS. Bu opsiyonları WITH ile beraber kullanırız.

 

WITH (ALLOW_ROW_LOCKS = ON)

 

ALLOW_PAGE_LOCKS : Kullanıldığında tablo ve sayfa-düzeyinde kilidi  olan  indekslere  erişim sağlar. Kapalı iken sayfa-düzeyli kilit kullanılmaz.

 

ALLOW_ROW_LOCKS: Kullanıldığında tablo ve satır düzeyinde kilidi olan indekslere  erişimi sağlar. Kapalı iken satır-düzeyli kilit kullanılmaz.

İki opsiyon aynı zamanda kullanılabilir.

 

Nonclusted indeksler de indekslenemeyen alanlar include komutu ile indeks tanımının bir parçası olarak kullanılabilirler. Kapsayan (Covering ) indekslerle ulaşılan sorgu performanslarındaki aynı artışı sağlar. SQL Server’ın daha önceki versiyonlarındaki  Composite indekslerin yerine geçerek  kullanılabilirler. SQL  Server 2000’de composite indeks büyüklüğü 900 byte ile sınırlı iken, include komutu ile 8060 byte’a kadar çıkabilir.

 

 

SQL Server 2005’teki diğer bir yenilik te  genellikle bölünmüş (partitoned) tablolar üzerinde  oluşturulan bölünmüş (partitioned )  indekstir. 

 

Xml   veri tipi de SQL 2005’le gelen bir yeniliktir. CREATE PRIMARY XML INDEX  ve

CREATE XML INDEX Transact-SQL konutları ile XML sütunları üzerine XML indexleri oluşturabiliriz.  Bu da XQuery işlemlerinde performansı  arttırır.

 

INDEX OLUŞTURMA:

 

SQL Server 2005 yeni index özelliklerini desteklemek üzere, CREATE INDEX söz dizimi geliştirdi. Object Explorer’daki the New Index dialog penceresinde de, bu yeni özelliklere erişebiliriz.

 

CREATE [UNIQUE][CLUSTERED | NONCLUSTERED] INDEX index_ismi

  ON [{database_ismi.[schema_ismi]. | schema_name.}]

    {table_veya_view_ismi}(sütun [ASC | DESC][,...n])

  [INCLUDE (sütun_ismi[,...n])]

  [WITH(<relational_index_option>[,...n])]

  [ON {partition_scheme_name(sütun_ismi[,...n])

    | filegroup_ismi | DEFAULT}]

 

<relation_index_option> ::=

  { PAD_INDEX = {ON | OFF}

  | FILLFACTOR = fillfactor değeri

  | SORT_IN_TEMPDB = {ON | OFF}

  | IGNORE_DUP_KEY = {ON | OFF}

  | STATISTICS_NO_RECOMPUTE = {ON | OFF}

  | DROP_EXISTING = {ON | OFF}

  | ONLINE = {ON | OFF}

  | ALLOW_ROW_LOCKS = {ON | OFF}

  | ALLOW_PAGE_LOCKS = {ON | OFF}

  | MAXDOP = processor_sayısı }

 

Eğer diğer DML işlemlerininin eşzamanlı olarak çalıştırılmasını istiyorsak,  CREATE INDEX statementi içindeki WITH deyiminde ONLINE=ON ayarı yapmalıyız.

 

CREATE INDEX IX_Employee_ManagerID

ON Sales.Employee (ManagerID)

WITH (ONLINE=ON)

 

INCLUDE deyimi ile indeksin leaf level’ına istediğimiz kolnların eklenmesi sağlayabiliriz. Ancak text,ntext ve image kolonları ekleyemeyiz. Nonclustered indexe 3 tane sütun ekleyelim.

 

CREATE NONCLUSTERED INDEX X_Adress_PostaKodu

ON Person.Adres (PostaKodu)

INCLUDE (AdresSatırı1, AdresSatırı2, Sehir)

 

 

xml, text, ntext, image, varchar(max), nvarchar(max), varbinary(max) kolonlu tablolar, online işlemlere izin vermezler.

 

Eğer indeksin bölünmüş (partitioned) olduğunu berlitmemişsek, fakat indekslenen tablonun kendisi bölünmüş ise, indeks tablonun şeması  aynı bölümü kullarak oluşur.

 

İyi çalışmalar.

 

Bülent Sözge