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.
[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.

0 comments:
Post a Comment