Index ‘lerin Bulundukları FileGroup ları Değiştirme Süreçleri

Index ‘lerin Bulundukları FileGroup ları Değiştirme Süreçleri

Index ‘lerin oluşturuldukları FileGroup ‘ları iki farklı yöntem ile değiştirebiliyoru. Bunlardan ilki DROP_Existing ifadesi ile diğeri ise klasik DROP-CREATE işlemi ile.

DROP-CREATE yönteminde bildiğiniz üzere ilk önce var olan Index ‘imizi DROP edip daha sonra Create ediyoruz.

DROP INDEX sqltr_NIX_Table_Test
GO
CREATE INDEX sqltr_NIX_Table_Test ON Table_Test (Column_A,Column_B)
ON [FileGroupNew]
GO

 

DROP_EXISTING ifadesi ile de ;

CREATE INDEX sqltr_NIX_Table_Test ON Table_Test (Column_A,Column_B)
WITH (DROP_EXISTING=ON)
ON [FileGroupNew]
GO

 

Peki biz bu durumda hangisi ile işlem yapmamız gerek ?
Aslında Cluster ve NonClustered ındex olarak süreci iki ayrı başlık altında yorumlamak gerekir ise ;

Clustered ındex te yaşanan süreç,

Clustered Index ‘i DROP-CREATE ile FileGroup değişikliği yaptığımızda tüm NonClustered ındex ‘ler 2 defa REBUILD oluyor. İlk DROP işleminde tüm NonClustered ındex lerin Leaf Level Page ‘lerinde ki Clustered Index Key ‘lerini kaldırıp Heap Row Pointer bilgilerinin konulması, Index tekrar Create edildiğinde de yani Clustered Index ‘in KEY bilgilerininde tekrar tüm NonClustered Index lerin Leaf Level ‘larına yerleştirilmesi süreci.

NonClustered Index te yaşanan süreç,
DROP-CREATE metodu ile tekrar oluşturulması daha fazla IO yapılmasına ve daha uzun sürede gerçekleşmesine sebebiyet verir. En büyük sebebi ise , DROP-CREATE metodunda Index tekrar Create edilirken Index Page leri tüm tablolar okunurak oluşturuluyor. DROP_EXISTING de ise hali hazırda olan Page leri kullanıp sadece Index’in Filegroup ‘unu değiştriyor ve tüm tablo okunmadığı için bize daha performanslı sonuç sağlıyor.
ÖNEMLİ : INDEX Filegroup değişimlerinde DROP_EXISTING komutunu kullanarak operasyonlarınızı yaparsanız daha performanslı ve daha hızlı süreçlerinizi gerçekleştirmiş olursunuz.

 

Örneğimizde konuyu daha detaylı İnceleyelim ,

Örnek 1: Clustered Index ‘i başka bir Filegroup a taşıyacağız.

Test veritabanımızı oluşturuyoruz.

CREATE DATABASE [SQLTR_Index_Demo]
ON PRIMARY
(NAME = N'SQLTR_Index_Demo', FILENAME = N'F:\DATA\SQLTR_Index_Demo.mdf', SIZE = 5120 KB, FILEGROWTH = 8192 KB),
FILEGROUP [ARCHIVE]
(NAME = N'SQLTR_Index_Demo_Archive', FILENAME = N'F:\DATA\SQLTR_Index_Demo_Archive.ndf', SIZE = 5120 KB, FILEGROWTH = 8192 KB),
FILEGROUP [index]
(NAME = N'SQLTR_Index_Demo_Index', FILENAME = N'F:\DATA\SQLTR_Index_Demo_Index.ndf', SIZE = 5120 KB, FILEGROWTH = 8192 KB),
FILEGROUP [log]
(NAME = N'SQLTR_Index_Demo_Log_', FILENAME = N'F:\DATA\SQLTR_Index_Demo_Log_.ndf', SIZE = 5120 KB, FILEGROWTH = 8192 KB)
LOG ON
(NAME = N'SQLTR_Index_Demo_log', FILENAME = N'E:\LOG\SQLTR_Index_Demo_log.ldf', SIZE = 1024 KB, FILEGROWTH = 10240 KB)
GO

Test veritabanımızın içerisine demo tablomuzu oluşturuyoruz.

USE [SQLTR_Index_Demo]
GO
CREATE TABLE dbo.Person (
	ID INT IDENTITY (1, 1)
   ,Name VARCHAR(75)
   ,SURNAME VARCHAR(150)
)
GO

Daha sonra tablo üzerine Primary FileGroup içerisine Index ‘imizi oluşturuyoruz.

CREATE CLUSTERED INDEX sqltr_NIX_Persone_Id
ON Person (ID)
GO

Index ‘imizin detayını help_index komutu ile kontrol edelim.

sp_helpindex Person

Yukarıda da görüldüğü üzere Index 2imiz PRIMARY Filegroup un içerisinde yer almaktadır.

SSMS üzerinden kontrol etmek istediğimizde ise ,

Veritabanımız altında tablo Tables içerisinde oluşturduğumuz tablonun altına girip orada ki Indexes sekmesi altında oluşturduğumuz Clustered Index i görüyoruz. Index in üzerine gelip sağ tıkladıktan sonra Proparties seçeneğine tıklıyoruz.

Aşağıda ki ekran karşımıza gelmekte ve sol tarafta ki Storage sekmesine basarak Filegroup bilgisini bu ekranda da görebilir hatta değiştirebiliriz fakat GUI üzerinden bu tarz riskli işleri yapmanızı hiçbir zaman önermem.

DROP_EXISTING metodu ile Index ‘imizin Filegroup unu değiştirelim ,

CREATE CLUSTERED INDEX [sqltr_NIX_Persone_Id] ON [dbo].[Person]
(
	[ID] ASC
)WITH ( DROP_EXISTING = ON, ONLINE = ON) ON [INDEX]

GO

sp_helpindex ile kontrol edelim hızlı bir şekilde ,

sp_helpindex Person

Gördüğünüz üzere index_description alanında artık INDEX filegroup una taşınmıştır.

Şimdi ise hem Primary Key olan hem de Clsutered Index olan kolondan Clustered Index ‘in Filegroup unu nasıl değiştiririz onu göreceğiz ;

Test tablomuzu oluşturuyoruz

USE [SQLTR_Index_Demo]
GO
CREATE TABLE dbo.Person_2 (
	ID INT IDENTITY (1, 1) PRIMARY KEY CLUSTERED 
   ,Name VARCHAR(75)
   ,SURNAME VARCHAR(150)
)
GO

Personel_2 adında oluşturduğumuz test tablomuzun Index yapısına help_index ile kontrol ediyoruz.

sp_helpindex Person_2

Index_description alanını gördüğünüzde Id kolonunun hem Primary key hemde unique clustered index olduğunu öğrendik.

CREATE UNIQUE CLUSTERED INDEX PK__Person_2__3214EC272F99256E ON Person_2
(
ID
) 
WITH ( DROP_EXISTING = ON, ONLINE = ON) ON [INDEX]
GO

Index ‘imizi başka bir filegroup taşıdığımızda aynı şekilde PK nında orada yer aldığını görmketeyiz.

 

NOT : Örneğimizin amacı DROP_EXISTING yöntemi ile Index lerimizi başka FileGroup ‘lara nasıl taşınacağını göstermek.

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *