เนื่องจากทุก transaction จะต้องถูกเขียนลง log ก่อนที่จะลง data file ดังนั้นหาก transaction มีขนาดใหญ่ เช่น ลบหลาย record ขนาดรวม 5GB ก็จำเป็นต้องเขียน logs ขนาด 5GB แม้ว่าจะเป็น simple recovery model ก็ตาม นอกจากนี้จะทำให้เกิด I/O สูงมากด้วย ดังนั้นแนะนำให้ซอยเป็น transaction ย่อยๆ โดยใช้ TOP และ @@ROWCOUNT มาช่วยทำงานครับ ตัวอย่างตามข้างล่าง


DECLARE @Done BIT
SET @Done = 0
WHILE @Done = 0
  BEGIN
    DELETE TOP (20000) -- reduce if log still growing
      FROM SomeTable WHERE SomeColumn = SomeValue
    IF @@ROWCOUNT = 0
      SET @Done = 1
    CHECKPOINT -- marks log space reusable in simple recovery
  END

ที่มา http://stackoverflow.com/questions/1448857/there-must-be-a-way-to-delete-data-in-sql-server-w-o-overloading-the-log

Advertisement