Breaking News
Loading...
13/03/2013

Xóa table dùng Truncate và Delete

I. VẤN ĐỀ ĐẶT RA: Có 2 cách bạn có thể xóa dữ liệu trong 1 table: dùng TRUNCATE và DELETE. Mặc dù cả 2 cách làm cùng 1 công việc, nhưng cách thức thì khác nhau. Có những lợi ích, hạn chế mà ta nên biết để quyết định dùng phương thức nào.
II. GIẢI PHÁP:
1. Xóa dữ liệu dùng TRUNCATE
  • TRUNCATE nhanh chóng xóa toàn bộ dữ liệu trong 1 table bằng cách thu hồi không gian đĩa được cấp phát cho những trang dữ liệu của table (SQL lưu dữ liệu thành nhiều trang).
  • Những record bị xóa khi dùng TRUNCATE  không thể roll back, vì TRUNCATE chỉ log lại quá trình giải phóng không gian đĩa, điều này làm TRUNCATE chạy nhanh hơn DELETE.
  • Hoàn toàn không thể dùng ‘WHERE’ để giới hạn số dòng bị xóa, mà là tất cả số dòng trong 1 bảng sẽ bị xóa.
  • Lợi ích của TRUNCATE là ngoài vệc xóa toàn bộ 1 table, nó còn reset lại cột Identity trở về giá trị ban đầu, và không gian lưu trữ được trả về cho hệ thống. Ví dụ bạn có 1 table với 1 cột Identity bắt đầu từ 1 đến 100
    • Sau khi dùng TRUNCATE, bạn insert 1 dòng mới, thì cột Indentity sẽ bắt đầu từ 1.
    • Còn nếu bạn dùng DELETE thì cột Identity sẽ bắt đầu từ 101.
  • Ngoài ra, nếu những table muốn xóa được cấu hình Replication hay Log Shipping, bạn không thể dùng TRUNCATE.
  • Nếu 1 table có khóa ngoại (Foreign key), bạn phải drop constraint, dùng lệnh TRUNCATE, rồi kéo lại Relationship cho table đó.
2. Xóa dữ liệu dùng DELETE
  • Dùng DELETE xóa nhiều dòng cùng lúc, từng dòng bị xóa sẽ được ghi vào Transaction log. Điều này làm DELETE chậm hơn TRUNCATE.
  • Mặc dù tiêu tốn nhiều resource và lock, những transaction này có thể được Roll back nếu cần thiết.
  • Ta có thể dùng ‘WHERE’ để giới hạn số dòng bị xóa.
  • Không như  TRUNCATE, nếu table có khóa ngoại, bạn vẫn xóa được dễ dàng.
III. THỰC HÀNH Bước 1: Tạo 1 bảng 'tblTest' và insert vào 20 dòng [sql] WITH nums AS ( SELECT 1 AS n UNION ALL SELECT n+1 FROM nums WHERE n < 20 ) SELECT n INTO tblTest FROM nums SELECT * FROM tblTest [/sql] Bước 2: Xóa tất cả số dòng của bảng 'tblTest' và chạy tiếp câu lệnh dùng sp_spaceused. Ta thấy số dòng còn lại là 0, nhưng không gian đĩa vẫn được cấp phát cho bảng 'tblTest' là 24KB. Bước 3: Bây giờ lập lại bước 1 tạo 20 dòng, và xóa dữ liệu, nhưng lần này dùng TRUNCATE, ta thấy tất cả số đòng cũng bị xóa, và không gian đĩa được giải phóng trả về cho hệ thống.
Quang Vinh mai.quangvinh@sqlvn.com

0 comments:

Post a Comment

 
Toggle Footer