Truncate ve Delete Komutlari Arasindaki Farklar

Truncate ve Delete Komutlari Arasindaki Farklar:

Truncate ve Delete komutlarinin ikiside bir tabloda bulunan kayitlari silmek için kullanilir. Iki komutta sadece belirtilen tablodaki kayitlari siler yani tabloyu fiziksel olarak ortadan kaldirmazlar. Iki komutta tablodaki kayitlari silmesine ragmen; yazim sekillleri, performans, kaynak kullanimi gibi konularda farkli davranirlar. Bu makalemizde bu iki komutu detayli olarak inceleyecegiz.

Truncate

Truncate komutu transaction log içinde satir silinme logu tutmadan tablo içindeki tüm veriyi siler. Truncate komutu Delete komutu gibi sadece tablo içindeki veriyi siler fakat delete komutunda oldugu gibi where cümlesi ile filtre uygulanmasina izin vermez.

Truncate Yazim Sekli:

TRUNCATE TABLE [ { veritabani_adi.[ schema_adi ].} ] tablo_adi

Örnek:

truncate table Yazilimmutfagi.dbo.Makale

Yukaridaki komut Makale tablosunda bulunan tüm kayitlari siler.

Delete

Delete komutuda tabloda bulunan veriler siler fakat her satir silme islemi için transaction log tutar. Delete komutu ile beraber Where ifadesinide kullanarak sadece belirli kriterlere uyan satirlari silebilirsiniz.

Delete Komutu Basit Yazim Sekli

.
DELETE FROM TABLO_ADI [Veritabi_adi.Schema_Adi].Tablo_Adi

Remark Delete komutunun detayli yazim sekline su linkten ulasabilirsiniz.

Örnek:

DELETE FROM Makale

Yukaridaki komut Makale tablosundaki tüm kayitlari siler.

Delete komutu ile sileceginiz kayitlari Where ifadesi ile kosula baglayabilirsiniz. Böylece tabloda bulunan sadece belirli kayitlari silme sansiniz olur.

DELETE from Makale Where YazarId = 167

Yukaridaki Delete komutu sadece ile YazarID si 167 olan makaleleri silmis olduk. 167 ID li yazar disindaki yazarlara ait makaleler silinmemis oldu.

Truncate ve Delete Arasindaki Farklar

Birbiri ile ayni görünen iki komut arasindaki ortak noktalar ve farkla su sekilde:

Iki komutta tablonun yapisal içerigini degil sadece içindeki verileri siler, böylece bu komutlar sonucunda tabloya ait kolon, index ve bunun gibi yapilar sabit kalir. Eger tabloyu komple fiziksel olarak silmek istiyorsaniz DROP komutunu kullanmaniz gerekir.

Tablo Içindeki Verileri Sartli Olarak Silmek

Verileri Sartli olarak silmeden kasit, tablo içindeki tüm verileri degil sadece belirli sartlara bagladigimiz verileri silmektir. Örnegin, sadece belilir bir makaleyi veya sadece belirli bir yazara ait makaleleri silmek gibi.

Yukarida da ifade ettigimiz gibi Truncate komnutu ile bunu yapamayiz, Truncate komutu tablo içindeki tüm veriyi silecektir. Delete komutu ile Where cümlesinde velirttigimiz sartlara uyan kayitlar silinecektir.

Delete ve Truncate Komutlarinin Her ikiside loglanan islemlerdir.

Çogu kaynakda truncate için log tutulmayan fakat delete için log tutulan komutlardir densede isin aslinda iki komut içinde log tutulur. Truncate komutuda log olarak tutulur fakat Delete komutundan biraz daha farkli olarak loglanir. Truncate daha az log kaynagi tüketirken Delete komutu çok daha fazla log kaynagi tüketir. Trunate komutunun daha hizli çalismasinin altinda yatan temel nedende budur.

  • Delete komutu satirlari tek tek siler, ve sildigi her satir için bir transaction log girisi yapar. Bu yüzden Delete komutu ile çok fazla veri olan bir tabloyu sildiginizde transaction log çok büyür ve silme islemi çok yavas olur. Bu durum sadce “full recovery mode” ile çalisiyorsaniz geçerlidir. Eger “full recovery mode” da çalismiyorsaniz delete islemleri daha hizli olacaktir.
  • Truncate komutu ise tabloya ait veri blogunu (data pages) serbest birakir , böylece tüm satirlari tek seferde siler ve sadece bu serbest birakma isleminim logunu tutar. Bu yüzdendirki sildiginiz tablo ne kadar büyük olursa olsun Truncate komutu çok hizli çalisir. Açikcasi truncate komutu tabloda bulunan verileri silmez sadece veri blogunu serebest birakir. Bu yüzden veritabani shrink yapilana kadar veya bu bloga yeni veri yazilana kadar silindigini sandigimiz veriler hala ordadir. Bu islem çok fazla kaynak tüketmeyecegi için Truncate komutu çok hizli çalismaktadir. Çogu kaynakdaki truncate komutunun loglanmayan bir komut olmasi ve geriye dönüs yapilamayacagi ifadeleri yanlistir. Eger Truncate komutunu bir transaction içinde kullanirsaniz ve sonrasinda roll-back yaparsaniz, serbest birakilan veri blogu yeniden tabloya baglanarak eski haline getirilmis olur.

Delete ve Truncate komutlari ile silinen Kayitlarin Rollback ile Geri Alinmasi:

Örnek 1

.

Delete komutu ile sildigimiz kayitlari rollback ile nasil geri aliriz,

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('Acer')
BEGIN TRAN
  DELETE FROM tranDeneme --1.Bolum
  SELECT * FROM tranDeneme --2.Bolum
ROLLBACK --3.Bolum
  SELECT * FROM tranDeneme --4.

Yukaridaki sorgu çalistigi zaman ;

  • 1.Bolumde tablodaki veriler silinir
  • 2.Bolumde select soonucu 0 kayit döner
  • 3.Bolumde Rollback islemi gerçeklestirilir
  • 4.Bolumdeki select, rollback yaptigimiz için 5 kayit döndürür. Yani sildigimiz kayitlarin geri geldigini görürüz.

Örnek 2

Bu örnekde ise Örnek 1 dekinden farkli olarak Truncate ile sildigimiz kayitlarin nasil geriye alinabildiginiz görecegiz.

drop table tranDeneme --Tablomuzu siliyoruz
--daha sonra yeniden olusturuyoruz.
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('Acer')

BEGIN TRAN
  TRUNCATE TABLE tranDeneme --1.Bolum
  SELECT * FROM tranDeneme --2.Bolum
ROLLBACK --3.Bolum
  SELECT * FROM tranDeneme --4.

Yukaridaki sorgu çalistigi zaman ;

  • 1.Bolumde tablodaki veriler truncate komutu ile silinir. (aslinda date pageler serbest birakilir.)
  • 2.Bolumde select soonucu 0 kayit döner
  • 3.Bolumde Rollback islemi gerçeklestirilir
  • 4.Bolumdeki select, rollback yaptigimiz için 5 kayit döndürür. truncate ile serbest birakilan data pageler yeniden tabloya baglandigi için kayitlar silinmemis olurlar.

Yukaridaki örneklerde gördügümüz gibi delete ve truncate komutu ile silinen kayitlar eger bir transaction içinde yapildui ise geri alinabiliyor. Delete komutu her satiri silme islemini log olarak tuttugu için sonradan da loglar üzerinden kayitlar geri döndürülebilir.

.

4 thoughts on “Truncate ve Delete Komutlari Arasindaki Farklar

  1. truncate isleminde sadece tek bir log tutulur, oda serbest birakilan data page e ait logdur. fakat delete kullaniyorsaniz ve full recovery log da çalisiyorsaniz bir sure sonra log dosyaniz siser. buyüzden tüm tablodaki kayitlari siliyorsaniz delete yerine truncate kullanmanizi tavsiye ederim

  2.  Selam,

    Peki sürekli truncate veya delete yapilan bir tabloya, daha sonra sürekli yogun veriler ekleniyor.

    Her seferinde truncate ediyoruz ancak loglarda vs… bir yerlerde sisme, tabloda bir sikintiya yol açar mi bu islem?

    tsk

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir