(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, TRUNCATE
ve arasındaki farklar DELETE
:
- Alan kullanımı günlüğü:
TRUNCATE
yalnızca sayfaları / uzantıları * serbest bırakır , oysa DELETE
bireysel satırları günlüğe kaydeder.
- Kilit kullanımı:
TRUNCATE
genellikle daha az kilit kullanacaktır, çünkü DELETE
sıra kilit kullanan ** , bir tablo kilidi ve sayfa kilitleri alır .
IDENTITY
sekanslar: TRUNCATE
Varsa, 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 TABLE
kesinlikle daha iyidir DELETE FROM TABLE
(NB: TRUNCATE
baş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>' after
TRUNCATE /
DELETE` komutunu çalıştırın, böylece sorgu optimizatörü eski istatistiklere göre uyarılmaz.
TRUNCATE TABLE
yerine kullanmanızı öneririmDELETE FROM
.