SQL Server 2016 – ALTER COLUMN (Online) Operasyonu

SQL Server 2016 versiyonu ile ALTER COLUMN operasyonlarımızı ONLINE yapabiliyoruz.Önceden bu özllik olmadığından Column Alter etmek Prod sistemlerde ço zor ve Blockingler oluşturuyordu ve bizde bu tarz işlemlerimizi günün en az yoğun olduğu saatlerde genelde gece operasyonlarında gerçekleştiriyorduk. Bu da bize ekstra iş gücü ve maliyet oluşturuyordu.

2016 versiyonu ile bu işlemlerimizi ONLINE yapabilme özelliğini SQL Server destekler duruma getirdi.

Örneklerimiz ile konuyu daha net ele alalım. ONLINE olmadan ALTER Column Operasyonu gerçekleştirelim ve o sırada başka sessionlardan aynı tablo ve kolona erişmek isteyelim ve bu şekilde session durumlarını gözleyelim.

İlk önce bir demo tablo oluşturuyoruz ve içerisine data basıyoruz.

USE SQLTURKIYE
GO

CREATE TABLE [dbo].[Person](
	[BusinessEntityID] [int] NOT NULL,
	[PersonType] [nchar](2) NOT NULL,
	[NameStyle] [nvarchar] (50) NOT NULL,
	[Title] [nvarchar](8) NULL,
	[FirstName] [nvarchar] (50) NOT NULL,
	[MiddleName] [nvarchar] (50) NULL,
	[LastName] [nvarchar] (50) NOT NULL,
	[Suffix] [nvarchar](10) NULL,
	[EmailPromotion] [int] NOT NULL,
	[AdditionalContactInfo] [xml] NULL,
	[Demographics] [xml]NULL,
	[rowguid] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
	[ModifiedDate] [datetime] NOT NULL,
 CONSTRAINT [PK_Person_BusinessEntityID_xyz] PRIMARY KEY CLUSTERED 
(
	[BusinessEntityID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

Daha sonra AdvantureWorks2016 veritabanında yer alan Person tablosundan  bu tabloya veri aktaralım.

-- Demo tablomuza data basıyoruz.
INSERT INTO [dbo].[Person] SELECT * FROM [AdventureWorks2016].[Person].[Person]
GO

Şimdi ise LastName kolonumuzun data type ını değiştirelim ve aynı anda iki ayrı session açıp birinde tablomuza Select çekip diğer sessionda da session durumlarını gözlemliyoruz.

Alter Column İşlemi :

-- Session= 81
ALTER TABLE [dbo].[Person] ALTER COLUMN [LastName] VARCHAR (600) NOT NULL

SELECT işlemi :

-- Farklı Sessionda aşağıd aki SELECT i çalıştırın. (Session = 82)

SELECT TOP 99999 * FROM   [dbo].[Person] ORDER BY [AdditionalContactInfo]

Monitor İşlemi :

-- Başka bir sessionda da aşağıdaki scripti çalıştırarak sessionlaın durumunu gözlemleyelim.

Select spid, blocked,dbid,status,cmd from sys.sysprocesses Where spid=81 OR spid=82

 

Monitoring süreci sonucunda gördüğümüz üzere ,

 

ALTER Table operasyonumuz SELECT operasyonumuzu block lamaktadır.

2016 verisyonu ile hayatımıza giren ALTER ONLINE COLUMN özelliği ile örneğimizi şimdi yapalım ve sonucu gözlemleyelim .

Aşağıda ki script ile ONLINE ALTER Column işlemi yapıyoruz. WITH (ONLINE=ON) ifadesini kullanarak.

-- Session = 81
ALTER TABLE [dbo].[Person] ALTER COLUMN [LastName] VARCHAR (600) NOT NULL
WITH (ONLINE=ON)

Daha sonra başka bir session da tablomuza SELECT işlemi uyguluyoruz.

-- session = 82
SELECT TOP 10000 * FROM   [dbo].[Person] ORDER BY [LastName]	

Bu işlemleri diğer sessionda gözlemliyoruz.

Select spid, blocked,dbid,status,cmd from sys.sysprocesses Where spid=81 OR spid=82

 

,

 

Görüldüğü üzere iki işlemimizde aynı anda birbirini kitlemeden çalışmaktadır. status den runnable olduğunu görmekteyiz.

NOT: Çok yoğun sistemleriniz de bu işlemi yaparken yine de çok dikkatli olmanızı ve sistemin yoğun olmadığı zamanlarda gerçekleştirmenizi öneririm. Hatta ilk önce test ortamlarınızda yapın ve ortalama sürelerini çıkartın. ONLINe işlem olduğu için Offline işleme göre daha uzun sürecektir büyük ve yoğun tablolarda.

 

Kolay Gelsin.

Leave a Reply

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