it-swarm-vi.tech

Cách nhanh nhất để xóa tất cả dữ liệu trong một bảng lớn

Tôi đã phải xóa tất cả các hàng khỏi bảng nhật ký chứa khoảng 5 triệu hàng. Thử nghiệm ban đầu của tôi là đưa ra lệnh sau trong trình phân tích truy vấn:

xóa khỏi client_log

mà mất một thời gian rất dài.

44
Ron Skufca

Kiểm tra bảng rút gọn nhanh hơn rất nhiều.

76
Rob Walker

Tôi đã phát hiện ra TRUNCATE TABLE trong tham chiếu SQL transact-SQL. Đối với tất cả quan tâm ở đây là những nhận xét:

TRUNCATE TABLE có chức năng giống hệt với câu lệnh DELETE không có mệnh đề WHERE: cả hai loại bỏ tất cả các hàng trong bảng. Nhưng TRUNCATE TABLE nhanh hơn và sử dụng ít tài nguyên nhật ký hệ thống và giao dịch hơn XÓA.

Câu lệnh DELETE xóa từng hàng một và ghi lại một mục trong nhật ký giao dịch cho mỗi hàng bị xóa. TRUNCATE TABLE xóa dữ liệu bằng cách sắp xếp lại các trang dữ liệu được sử dụng để lưu trữ dữ liệu của bảng và chỉ các giao dịch trang được ghi lại trong nhật ký giao dịch.

TRUNCATE TABLE xóa tất cả các hàng khỏi một bảng, nhưng cấu trúc bảng và các cột, các ràng buộc, chỉ mục, v.v. Bộ đếm được sử dụng bởi một danh tính cho các hàng mới được đặt lại thành hạt giống cho cột. Nếu bạn muốn giữ lại bộ đếm danh tính, thay vào đó hãy sử dụng XÓA. Nếu bạn muốn xóa định nghĩa bảng và dữ liệu của bảng, hãy sử dụng câu lệnh DROP TABLE.

Bạn không thể sử dụng BẢNG TRUNCATE trên bảng được tham chiếu bởi ràng buộc FOREIGN KEY; thay vào đó, hãy sử dụng câu lệnh XÓA mà không có mệnh đề WHERE. Vì TRUNCATE TABLE không được ghi lại, nó không thể kích hoạt kích hoạt.

TRUNCATE TABLE có thể không được sử dụng trên các bảng tham gia vào chế độ xem được lập chỉ mục.

33
Ron Skufca

Có một huyền thoại phổ biến rằng TRUNCATE bằng cách nào đó bỏ qua nhật ký giao dịch.

Đây là sự hiểu lầm và được đề cập rõ ràng trong MSDN.

Huyền thoại này được viện dẫn trong một số ý kiến ​​ở đây. Chúng ta hãy cùng nhau xóa bỏ nó;)

15
squadette

Để tham khảo TRUNCATE TABLE cũng hoạt động trên MySQL

6
UnkwnTech

quên cắt ngắn và xóa. duy trì định nghĩa bảng của bạn (trong trường hợp bạn muốn tạo lại nó) và chỉ cần sử dụng bảng thả.

3
siculars

Tôi sử dụng phương pháp sau để loại bỏ các bảng, với phần thưởng được thêm vào mà nó để lại cho tôi một bản sao lưu trữ của bảng.

CREATE TABLE `new_table` LIKE `table`;
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`;
3
dar7yl

Trên SQL Server, bạn có thể sử dụng Truncate Table lệnh nhanh hơn xóa thông thường và cũng sử dụng ít tài nguyên hơn. Nó cũng sẽ thiết lập lại bất kỳ trường nhận dạng nào trở lại giá trị hạt giống.

Hạn chế của việc cắt ngắn là nó không thể được sử dụng trên các bảng được tham chiếu bởi các khóa ngoại và nó sẽ không kích hoạt bất kỳ trình kích hoạt nào. Ngoài ra, bạn sẽ không thể khôi phục dữ liệu nếu có sự cố.

1
Martynnw

truncate tablekhông SQL độc lập với nền tảng. Nếu bạn nghi ngờ rằng bạn có thể từng thay đổi nhà cung cấp cơ sở dữ liệu, bạn có thể cảnh giác khi sử dụng nó.

1
James A. Rosen

Lưu ý rằng TRUNCATE cũng sẽ đặt lại bất kỳ phím tăng tự động nào, nếu bạn đang sử dụng các phím đó.

Nếu bạn không muốn mất các phím tăng tự động, bạn có thể tăng tốc độ xóa bằng cách xóa trong các bộ (ví dụ: XÓA TỪ bảng WHERE id> 1 VÀ id <10000). Nó sẽ tăng tốc đáng kể và trong một số trường hợp ngăn chặn dữ liệu bị khóa.

1
Brian D.

Gợi ý "Thả và tạo lại bảng" có lẽ không phải là một gợi ý hay vì điều đó làm tăng các khóa ngoại của bạn.

Bạn đang sử dụng khóa ngoại, phải không?

0
Andy Lester

Vâng, tốt, xóa 5 triệu hàng có lẽ sẽ mất nhiều thời gian. Cách duy nhất có khả năng nhanh hơn tôi có thể nghĩ đến là bỏ bảng và tạo lại nó. Điều đó chỉ hoạt động, tất nhiên, nếu bạn muốn xóa TẤT CẢ dữ liệu trong bảng.

0
TheSmurf

cắt ngắn bảng client_log

là đặt cược tốt nhất của bạn, cắt ngắn giết chết tất cả nội dung trong bảng và các chỉ số và đặt lại bất kỳ hạt giống nào bạn cũng có.

0
Ronald Hobbs

Tôi đang sửa đổi tuyên bố trước đây của tôi:

Bạn nên hiểu rằng bằng cách sử dụng TRUNCATE, dữ liệu sẽ bị xóa nhưng không có gì được ghi vào nhật ký giao dịch. Viết vào nhật ký là lý do tại sao XÓA sẽ mất mãi mãi trên 5 triệu hàng. Tôi sử dụng TRUNCATE thường xuyên trong quá trình phát triển, nhưng bạn nên cảnh giác về việc sử dụng nó trên cơ sở dữ liệu sản xuất vì bạn sẽ không thể khôi phục các thay đổi của mình. Bạn nên lập tức sao lưu cơ sở dữ liệu đầy đủ sau khi thực hiện TRUNCATE để thiết lập cơ sở mới cho việc khôi phục.

Tuyên bố trên có ý định Nhắc bạn để chắc chắn rằng bạn hiểu có sự khác biệt giữa hai điều này. Thật không may, nó được viết kém và đưa ra những tuyên bố không được hỗ trợ vì tôi chưa thực sự thực hiện bất kỳ thử nghiệm nào giữa hai người. Nó dựa trên những tuyên bố mà tôi đã nghe từ những người khác.

Từ MSD :

Câu lệnh DELETE xóa từng hàng một và ghi lại một mục trong nhật ký giao dịch cho mỗi hàng bị xóa. TRUNCATE TABLE xóa dữ liệu bằng cách sắp xếp lại các trang dữ liệu được sử dụng để lưu trữ dữ liệu của bảng và chỉ các giao dịch trang được ghi lại trong nhật ký giao dịch.

Tôi chỉ muốn nói rằng có một sự khác biệt cơ bản giữa hai và bởi vì có một sự khác biệt, sẽ có những ứng dụng mà cái này hoặc cái kia có thể không phù hợp.

0
Andy Frieders

Nếu bạn không thể sử dụng TRUNCATE TABLE vì khóa ngoại và/hoặc kích hoạt, bạn có thể xem xét để:

  • bỏ tất cả các chỉ số;
  • thực hiện XÓA thông thường;
  • tạo lại tất cả các chỉ mục.

Điều này có thể tăng tốc độ XÓA phần nào.

0
squadette