INT Kolonu BIGINT Tipine Dönüştürme

Örnek olarak AdventureWorks db'sinin Sales.SalesOrderDetail tablosu kullanılacaktır.

Bu ders Maksimum IDENTITY Değerleri ile Tabloyu Online Alter Etme dersleriyle alakalı olduğundan öncelikle onları okumanızı tavsiye ederim. 

O kara günün gelip çattığını ve INT kolonun maksimum değerine (2.147.483.647) yaklaştığını düşünelim. Bu noktada elimizde farklı seçenekler var ve o anki duruma göre herhangi biri uygulanabilir; şimdi o yöntemlerin bazılarından kısaca bahsetdelim:

Yöntem 1: DBCC CHECKIDENT('Sales.SalesOrderDetail',RESEED,-217483647);

Msg 8115, Level 16, State 1, Line 13
Arithmetic overflow error converting IDENTITY to data type int.
Arithmetic overflow occurred.

 

Eğer çok fazla zamanınız yoksa hatta yukarıdaki gibi bir hatayla karşılaşıyorsanız en hızlı yöntem IDENTITY kolonu -217483647 sayısına RESEED etmektir. Bu sayede kesin bir çözüm bulana kadar hatrı sayılır bir zaman kazanmış olursunuz. Bu yöntemde dikkat edilmesi gereken husus, kolonun son kullanıcılar için veya raporlama için vs. bir anlam ifade etmemesi gerektiğidir. Örneğin çekilen bir sorguda bu kolona göre sıralama yapılıyorsa yanlış data döner.

Yöntem 2: ALTER TABLE [Sales].[SalesOrderDetail] ALTER COLUMN [SalesOrderDetailID] BIGINT;

Bu akla gelen ilk yöntemdir herhalde, bunun dışında pek bir avantajı yok. Dezavantajları log'u şişirmesi, işlem tamamlanana kadar tabloya lock koyması, tabloda fragmentasyonu artırması... Alter edilecek kolona bağımlı index, view, FK, PK, computed column varsa drop edilip işlemin ardından tekrar oluşturulması gerektiğine de dikkat çekmek isterim.

Yöntem 3: Bu yöntemin kısaca adımları:

  • 1: İki adet şema (A, B şeması olsun) oluşturulur.
  • 2. Tablonun aynısı (bigint kolon hariç) A şemasında create edilir.
  • 3. Asıl tablodan yeni oluşturulan tabloya data transfer edilir.
  • 4. Asıl tablo B şemasına, yeni tablo asıl tablonun şemasına taşınır.

Bu yöntemin en büyük dezavantajı online olmaması. 3. adımda data parça parça kopyalanması log'un büyümesini engelleyebilir.

Yöntem 4: Bu yöntemden Tabloyu Online Alter Etme dersinde bahsetmiştim, tekrar edecek olursak:

  • 1: İki adet şema (A, B şeması olsun) oluşturulur.
  • 2. Tablonun aynısı (bigint kolon hariç) A şemasında create edilir.
  • 3. Asıl tablomuzdan INSERT, UPDATE, DELETE trigger'ları oluşturulur. Bu sayede tabloda yapılan değişiklikler diğer tablomuza da yansır.
  • 4. Asıl tablodan yeni oluşturulan tabloya data transfer edilir.
  • 5. Asıl tablo B şemasına, yeni tablo asıl tablonun şemasına taşınır.
  • 6. Yeni oluşturulan trigger'lar drop edilir.

Şema değişikliği yapmadan önce schema bound view'leri drop etmek gerektiğini hatırlatırım.

Kaynak Dosya'yi indirerek kullandığım sorguları inceleyebilirsiniz.

Konuyla ilgili daha detaylı bilgi için:

http://sqlperformance.com/2016/01/sql-indexes/widening-identity-column-1

http://www.littlekendra.com/2016/08/04/altering-an-int-column-to-a-bigint-dear-sql-dba-episode-11/

https://sqlstudies.com/2016/07/14/altering-a-column-in-a-large-table-a-case-study/


Enes Kütük
1991 yılında İstanbul'da doğdum. 2014 Namık Kemal Üniversitesi Bilgisayar Mühendisliği bölümünden mezun oldum. Kariyerime veritabanı yöneticisi olarak devam ediyorum.
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git