(Bu aslında @ DaveE'nin cevabına yapılan bir yorumdu, ancak uzun sürdüğü için kendi cevabını koydum)
TRUNCATE olan bir günlüğe çalışma. Aksi halde ACID uyumlu değildir. Ancak, TRUNCATEve arasındaki farklar DELETE:
- Alan kullanımı günlüğü:
TRUNCATEyalnızca sayfaları / uzantıları * serbest bırakır , oysa DELETEbireysel satırları günlüğe kaydeder.
- Kilit kullanımı:
TRUNCATEgenellikle daha az kilit kullanacaktır, çünkü DELETEsıra kilit kullanan ** , bir tablo kilidi ve sayfa kilitleri alır .
IDENTITYsekanslar: TRUNCATEVarsa, tablodaki kimlik sekansını sıfırlar.
(* Bir kapsam = 8 sayfa TRUNCATE, hepsi bu tablodan çıkarsa uzantıları günlüğe kaydeder / kaldırır, aksi halde karışık uzantılardan sayfaları günlüğe kaydeder / kaldırır.
** Bunun bir yan etkisi DELETE FROM TABLE, operasyonun özel bir masa kilidi alıp alamayacağına bağlı olarak tabloya ayrılmış boş sayfaları potansiyel olarak boş bırakmasıdır.)
Yani (asıl soruya dönersek), masayı boşalttığınızdan ama yapıyı korumak istemenizden TRUNCATE TABLEkesinlikle daha iyidir DELETE FROM TABLE(NB: TRUNCATEbaşka bir tablodan gelen yabancı bir anahtar tarafından başvurulan bir masada kullanılamaz).
@ Tullo'nun yorumunda belirtildiği gibi, veritabanınızın kurtarma modelini de kontrol edin - eğer doluysa, ya günlük yedeklemeleri almaya başlamanız ya da kurtarma modelinizi basit olarak değiştirmeniz gerekir. Bunlardan birini yaptıktan sonra, tüm bu boş alanı geri kazanmak için günlük dosyanızı bir kereye mahsus bir işlem ( yalnızca NB: günlük dosyası ) olarak daraltmak istersiniz .
Son olarak, farkında olmak için başka bir şey - tablo istatistikleri. UPDATE STATISTICS <TABLENAME>' afterTRUNCATE /DELETE` komutunu çalıştırın, böylece sorgu optimizatörü eski istatistiklere göre uyarılmaz.
TRUNCATE TABLEyerine kullanmanızı öneririmDELETE FROM.