เลือกเป็น simple recovery model แล้ว ทำไม transaction logs ยังมีขนาดใหญ่

เนื่องจากทุก 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

Leave a comment