(Đây ban đầu là một nhận xét cho câu trả lời của @ DaveE, nhưng tôi đã đưa nó vào câu trả lời của riêng mình vì nó đã dài)
TRUNCATE
là một hoạt động đăng nhập. Mặt khác, nó phải không tuân thủ ACID. Tuy nhiên, sự khác biệt giữa TRUNCATE
và DELETE
:
- Sử dụng không gian
TRUNCATE
nhật ký : chỉ ghi nhật ký trang / phạm vi * được giải phóng, trong khi DELETE
ghi nhật ký từng hàng riêng lẻ.
- Sử dụng khóa:
TRUNCATE
thường sẽ sử dụng ít khóa hơn, vì nó cần khóa bảng và khóa trang, trái ngược với việc DELETE
sử dụng khóa hàng **.
IDENTITY
trình tự: TRUNCATE
đặt lại trình tự nhận dạng trên một bảng, nếu có.
(* Một phạm vi = 8 trang. TRUNCATE
Sẽ ghi / xóa các phạm vi nếu tất cả chúng đều nằm trong một bảng đó, nếu không, nó sẽ ghi / xóa các trang khỏi các phạm vi hỗn hợp.
** Một tác dụng phụ của việc này là DELETE FROM TABLE
có khả năng để lại các trang trống được phân bổ cho bảng, tùy thuộc vào việc thao tác có thể có khóa bảng độc quyền hay không.)
Vì vậy (trở lại câu hỏi ban đầu), TRUNCATE TABLE
sẽ tốt hơn so với việc DELETE FROM TABLE
bạn làm trống bảng nhưng muốn giữ cấu trúc (NB: TRUNCATE
không thể được sử dụng trên một bảng được tham chiếu bởi khóa ngoại từ bảng khác).
Như đã lưu ý trong nhận xét của @ Tullo, cũng kiểm tra mô hình khôi phục cơ sở dữ liệu của bạn - nếu nó đầy đủ, thì bạn cần phải bắt đầu sao lưu nhật ký hoặc thay đổi mô hình khôi phục của mình thành đơn giản. Khi bạn đã thực hiện một trong những người, có thể bạn sẽ muốn thu nhỏ log file của bạn như một lần-off hoạt động (NB: log file chỉ ) để đòi lại tất cả những gì không gian trống.
Cuối cùng, một điều khác cần lưu ý - thống kê bảng. chạy UPDATE STATISTICS <TABLENAME>' after
TRUNCATE /
DELETE` để trình tối ưu hóa truy vấn không bị tăng gấp ba bởi các thống kê cũ.
TRUNCATE TABLE
thay vìDELETE FROM
.