MSSQL Truncate ve Delete Komutları Arasındaki Farklar

0
3392
SQL

Truncate ve Delete komutlarının ikiside bir tabloda bulunan kayıtları silmek için kullanılır. İki komutta sadece belirtilen tablodaki kayıtları siler yani tabloyu fiziksel olarak ortadan kaldırmazlar. İki komutta tablodaki kayıtları silmesine rağmen; yazım şekilleri, performans, kaynak kullanımı gibi konularda farklı davranırlar.

Truncate

Truncate komutu transaction log içinde satır silme logu tutmadan tablo içindeki tüm veriyi siler. Truncate komutu Delete komutu gibi sadece tablo içindeki veriyi siler fakat delete komutunda olguğu gibi “where” filtresi uygunlanmasına izin vermez.

TRUNCATE TABLE veritabani_adi.schema_adi.tablo_adi
truncate table banasorun.dbo.Makale

Delete

Delete komutu tabloda bulunan verileri siler fakat her satır silme işlemi için transaction log tutar. Delete komutu ile beraber “where” ifadesini kullanarak sadece belirli kriterlere uygun satırları silebilirsiniz.

DELETE FROM TABLE veritabani_adi.schema_adi.tablo_adi
delete from Makale

Delete komutu ile sileceğiniz kayıtları “where” ifadesi ile koşula bağlayabilirsiniz. Böylece tabloda bulunan sadece belirli kayıtları silme şansınız olur.

delete from Makale where YazarID = 123 Bu komut sadece YazarID’si 123 olan makaleleri silmiş olacak. 167 ID’li yazar dışındaki yazarların makaleleri silinmemiş oldu.

Eğer tabloyu fiziksel olarak silmek istiyorsanız DROP komutunu kullanmanız gerekir.

DROP TABLE Makale

Delete ve Truncate komutlarının her ikiside loglanan işlemlerdir. Truncate komutu daha az kaynak tüketirken Delete komutu daha çok kaynak tüketir. Truncate komutunun daha hızlı çalışmasının altında yatan temel neden budur.

  • Delete komutu satırları tek tek siler ve sildiği her satır için bir transaction log girişi yapar. Bu yüzden delete komutu ile çok fazla veri olan bir tabloyu sildiğinizde transaction log büyür ve silme işlemi yavaşlar. Bu durum sadece “full recovery mode” ile çalışıyorsanız geçerlidir. Eğer “full recovery mode” ile çalışmıyorsanız delete işlemleri daha hızlı olacaktır.
  • Truncate komutu işe tabloya ait veri bloğunu(data pages) serbest bırakır. Böylece tüm satırları tek seferde siler ve sadece bu serbest bırakma işleminin logunu tutar. Bu yüzden sildiğiniz tablo ne kadar büyük olursa olsun Truncate komutu çok hızlı çalışır. Aslında Truncate komutu tabloda bulunan verileri silmez sadece veri bloğunu serbest bırakır.Veritabanı shrink yapılana kadar veya bu bloğa yeni veri yazılana kadar silindiğini sandığımız veriler hala oradadır. Bu işlem çok fazla kaynak tüketmeyeceği için Truncate komutu cok hızlı çalışır. Çoğu kaynaktaki Truncate komutunun loglanmayan bir komut olması ve geriye dönüş yapılamayacağı ifadesi yanlıştır. Eğer Truncate komutunu bir transaction içinde kullanırsanız ve sonrasında “rollback” yaparsanız, serbest bırakılan veri bloğu yeniden tabloya bağlanarak eski haline getirilmiş olur.

 

Delete ve Truncate komutları ile silinen kayıtların Rollback ile geri alınması

1-Delete komutu ile sildiğimiz kayıtları Rollback ile nasıl geri alırız?

CREATE TABLE tranDeneme
(
ID int Identity(1,1),
Marka Varchar(100)
)
INSERT INTO tranDeneme(Marka) VALUES(‘Vestel’)
INSERT INTO tranDeneme(Marka) VALUES(‘HP’)
INSERT INTO tranDeneme(Marka) VALUES(‘Dell’)
INSERT INTO tranDeneme(Marka) VALUES(‘Asus’)
INSERT INTO tranDeneme(Marka) VALUES(‘Samsung’)
BEGIN TRAN
DELETE FROM tranDeneme –1.bölüm
SELECT * FROM tranDeneme –2.Bölüm
ROLLBACK –3.Bölüm
SELECT * FROM tranDeneme –4.Bölüm

Yukarıdaki sorgu çalıştığı zaman;
• 1.Bölümde tablodaki veriler silinir.
• 2.Bölümde Select sonucu ‘0’ kayıt döner.
• 3.Bölümde Rollback işlemi gerçekleşir.
• 4.Bölümde Select, Rollback yaptığımız için ‘5’ kayıt döndürür. Yani silinen kayıtların geri döndüğünü görüyoruz.

Truncate komutu ile sildiğimiz kayıtları Rollback ile nasıl geri alırız?

drop table tranDeneme –tablomuzu siliyoruz.

CREATE TABLE tranDeneme
(
ID int Identity (1,1),
Marka Varchar(100)
)
INSERT INTO tranDeneme(Marka) VALUES(‘Vestel’)
INSERT INTO trandeneme(Marka) VALUES(‘HP’)
INSERT INTO trandeneme(Marka) VALUES(‘Dell’)
INSERT INTO trandeneme(Marka) VALUES(‘Asus’)
INSERT INTO trandeneme(Marka) VALUES(‘Samsung’)
BEGIN TRAN
TRUNCATE TABLE tranDeneme –1.Bölüm
SELECT * FROM tranDeneme –2.Bölüm
ROLLBACK –3.Bölüm
SELECT * FROM tranDeneme –4.Bölüm

 

 

Yukarıdaki sorgu çalıştığı zaman;
• 1.Bölümde tablodaki veriler Truncate komutu ile silinir.(Aslında date pages serbest bırakılır.)
• 2.Bölümde Select sonucu ‘0’ döner.
• 3.Bölümde Rollback işlemi gerçekleşir.
• 4.Bölümde Select, Rollback yaptığımız için ‘5’ kayıt döndürür. Truncate ile serbest bırakılan date pages yeniden tabloya bağlandığı için kayıtlar silinmemiş olur.

 

 

 

Yukarıdaki örneklerde gördüğümüz gibi Delete ve Truncate komutu ile silinen kayıtlar eğer bir transaction içinde yapıldı ise geri alınabiliyor. Delete komutu her satırı silme işlemini log olarak tuttuğu için sonradan da loglar üzerinden kayıtlar geri döndürülebilir.

 

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz