Büyük boyutlu tablolarda zaman kaybetmeden değişiklik yapmak

Büyük boyutlarda veri içeren bir veritabanı üzerinde geliştirme yaptığımızda değişiklik yapmak boyutu sebebiyle uzun zaman alabilir. Sadece tabloda alan ismi değiştirmek gibi basit bir değişiklik bile günler sürebilir. Bu soruna içinde milyonlorca satır veri içeren tablolar üzerinde değişiklik yapmaya kalktığımızda karşılaşırız. Uzun zaman gerektiren işlemler şunlar olabilir:
  • Tablodan alan silmek.
  • Tablonun mevcut alanlarında isim ya da tip değişikliği yapmak.
  • Tablodan index silmek.
Bu gibi sorunlarla karşılaştığımızda izlememiz gereken teknik oldukça basit. Yapmamız gereken sadece mevcut tablonun ve bağlı olduğu indexlerinin ismini değiştirmek. Biliyoruz ki boyutu ne olursa olsun tablo ismi ya da index ismi değişiklikleri anında gerçekleşir.

Milyon satır veri içeren bir tablo üzerinde alan ismi değişikliği yapmak istediğimizi düşünelim. Adım adım bunu bir örnekle yapalım:

Öncelikle mevcut tablomuzun CREATE scriptini alıp bir yere kaydedelim.Tablonun source yani CREATE scriptini oluşturmak için SQL SERVER gibi toolları kullanabiliriz ya da scriptimizi kendimiz de yazabiliriz. Mevcut tablomuzun ismi 'yorumlar' olsun. Yapacağımız değişiklik de `yorumcu_isim` alanını `yorumcu_isim_soyisim` olarak değiştirmek olsun.
CREATE TABLE `yorumlar` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `yazi_id` int(11) NOT NULL,
  `yorumcu_isim` varchar(35) NOT NULL,
  `yorumcu_site` varchar(100) NOT NULL,
  `yorumcu_yorum` varchar(800) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `date` date NOT NULL,
  `onay` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `yazi_id` (`yazi_id`)
) ENGINE=MyISAM AUTO_INCREMENT=431 DEFAULT CHARSET=latin1;
CREATE script'imizi bir yere kaydettiken sonra tablonun ismini değiştirelim.
ALTER TABLE yorumlar  RENAME TO yorumlar_dump;
Eğer tabloya bağlı bir indexler varsa aynı şekilde index'leri de yeniden isimlendiririz.
ALTER INDEX mevcut_index_ismi
RENAME TO yeni_index_dump;
Mevcut tablomuzun isminin 'yorumlar_dump' yaparak hem tablonun yedeğini almış hem de mevcut tablomuzu silmiş gibi olduk. Artık yapacağımız değişikliğimiz ne olursa olsun anında zaman kaybetmeden yapabiliriz. Bizim yapacağımız değişiklik sadece alan ismi değiştirmek olacak. Kaydettiğimiz CREATE scriptimizi açıp alan değişikliğimizi içerek şekilde değiştirelim:
CREATE TABLE `yorumlar` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `yazi_id` int(11) NOT NULL,
  `yorumcu_isim_soyisim` varchar(35) NOT NULL, 
  `yorumcu_site` varchar(100) NOT NULL,
  `yorumcu_yorum` varchar(800) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `date` date NOT NULL,
  `onay` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `yazi_id` (`yazi_id`)
) ENGINE=MyISAM AUTO_INCREMENT=431 DEFAULT CHARSET=latin1;

Yeni scriptimizi veritabanında çalıştırdığımızda istediğimiz değişikliği zaman kaybetmeden başarmış olduk. Eğer en başında direk olarak tablonun alan ismini değiştirmeye kalksaydık işlem inanılmaz uzun sürecek belki de hiç bir zaman bitmeyecekti.

Burada izlediğimiz yolda karşımıza çıkacak tek sıkıntı yeni tablomuzdaki ( 'yorumlar_dump' ) verilerin mevcut tabloya tekrar insert edilmesi olabilir. Son tablomuza dump tablosundan bir insert scriptpi yazarak tablomuza verilerli tekrar ekleyebiliriz. Bu insert scriptini de 10ar ya da 100'er şekilde insert etmesi için select statement'a ek seçenek ekleyebiliriz.

Umarım faydalı olmuştur.

yazan Zülküf Küçüközer tarih   20th May 2013
primary key words  Tablo | Zaman | Veritabanı | İsim değişikliği okunma  31904
secondary key words  Tablo değişikliği | Büyük boyut
writing ikinci el kalip writing 31st December 2014
Çok güzel basarili bir sekilde sorgladim
writing saksi fiyatlari writing 21st January 2015
Çok güzel bir kod la yazinizigüzel anlatmissiniz