2009-07-10 50 views
56

Normaly tôi sẽ làm delete * from XXX nhưng trên bảng này rất chậm, nó bình thường có khoảng 500k đến 1m hàng trong đó (một là một varbinary (MAX) nếu toán học đó).Xóa tất cả các hàng trong bảng

Về cơ bản im tự hỏi nếu có một cách nhanh chóng để Emty bảng của tất cả các nội dung, nó actualy nhanh hơn để thả và tạo lại nó sau đó để xóa các nội dung thông qua báo cáo kết quả sql xóa

Lý do tôi không muốn tạo bảng là vì nó được sử dụng và xóa/tái tạo nặng nề của tôi sẽ tiêu diệt các chỉ số và số liệu thống kê được thu thập bởi máy chủ sql

Tôi cũng hy vọng có một cách để làm điều này bởi vì có một cách "thông minh" để nhận số hàng thông qua sys .sysindexes, do đó, hy vọng có một cách thông minh ngang nhau để xóa nội dung

Trả lời

74

Truncate table nhanh hơn delete * from XXX. Delete là chậm bởi vì nó hoạt động một hàng tại một thời điểm. Có một vài tình huống mà truncate không hoạt động, mà bạn có thể đọc về trên MSDN.

+12

điều này cũng có tác dụng không thêm các hàng đã xóa vào nhật ký giao dịch. Do đó, nó không thể được khôi phục, nhưng cũng sẽ không lãng phí một loạt dung lượng đĩa –

11

tôi sẽ đề nghị sử dụng TRUNCATE TABLE, nó nhanh hơn và sử dụng ít tài nguyên hơn DELETE FROM xxx

Đây là liên quan MSDN article

21

Như khác đã nói, TRUNCATE TABLE được nhanh hơn nhiều, nhưng nó có một số hạn chế (được lấy từ here):

Bạn không thể sử dụng BẢNG TRUNCATE trên các bảng:

- Được tham chiếu bởi ràng buộc KEY NGOẠI TỆ. (Bạn có thể cắt một bảng có khóa ngoại tự tham chiếu.)
- Tham gia vào một chế độ xem được lập chỉ mục.
- Được xuất bản bằng cách sử dụng nhân rộng giao dịch hoặc nhân rộng hợp nhất.

Đối với các bảng có một hoặc nhiều đặc điểm này, hãy sử dụng câu lệnh DELETE để thay thế.

Hạn chế lớn nhất là nếu bảng bạn đang cố gắng để trống có khóa ngoài trỏ đến nó, sau đó cuộc gọi cắt ngắn sẽ không thành công.

+0

, Giải thích tuyệt vời. +1 cho cắt ngắn –

12

Bạn có thể đổi tên bảng được đề cập, tạo bảng có lược đồ giống hệt nhau, sau đó thả bảng gốc lúc rảnh rỗi.

Xem sách hướng dẫn tham khảo MySQL 5.1 cho các lệnh [RENAME TABLE] [1] và [CREATE TABLE] [2].

RENAME TABLE tbl TO tbl_old; 

CREATE TABLE tbl LIKE tbl_old; 

DROP TABLE tbl_old; -- at your leisure 

Cách tiếp cận này có thể giúp giảm thiểu thời gian ngừng hoạt động của ứng dụng.

Các vấn đề liên quan