2008-09-15 64 views

Trả lời

67

Khám phá truncate table nhanh hơn rất nhiều.

+4

TRUNCATE là nhanh nhất, chỉ cần nhớ rằng bạn sẽ KHÔNG thể khôi phục dữ liệu trong trường hợp xảy ra sự cố. –

+9

Lưu ý về TRUNCATE, Nếu một trong các cột là cột IDENTITY, TRUNCATE sẽ đặt lại SEED của cột đó thành giá trị ban đầu của nó (được chỉ định khi xác định bảng). Vì vậy, theo nghĩa nào đó, nó giống như bắt đầu với một cái bàn hoàn toàn mới. Tôi thấy nó hữu ích để làm sạch dữ liệu trước khi repopulating bảng – kristof

+0

Có, và trong Oracle World chúng tôi gọi nó là watermark shift, không chắc chắn về những người khác. –

0

Vâng, tốt, việc xóa 5 triệu hàng có thể 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à thả 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

bảng truncate client_log

là đặt cược tốt nhất của bạn, cắt xén kills tất cả nội dung trong bảng và các chỉ số và reset bất kỳ hạt bạn đã có quá.

1

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

Những hạn chế của truncate là nó không thể được sử dụng trên các bảng được tham chiếu bằng 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 xảy ra sự cố.

30

Tôi đã phát hiện ra BẢNG TRUNCATE trong tham chiếu giao dịch-msdn. Đối với tất cả các quan tâm ở đây là những nhận xét:

TABLE TRUNCATE có chức năng giống 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 DELETE.

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

TẮT TRUNCATE TABLE xóa tất cả các hàng khỏi bảng, nhưng cấu trúc bảng và các cột, ràng buộc, chỉ mục của nó vẫn giữ nguyên. Bộ đếm được sử dụng bởi 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ộ nhận dạng, hãy sử dụng DELETE. Nếu bạn muốn loại bỏ định nghĩa bảng và dữ liệu của nó, hãy sử dụng câu lệnh DROP TABLE.

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

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.

5

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

1

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

+6

DBMS doesn ' t hỗ trợ TRUNCATE TABLE?Oracle, SQL Server, Sybase ASE, MySQL, PostgreSQL, DB2 - tất cả hỗ trợ TRUNCATE TABLE –

0

Đề xuất "Thả và tạo lại bảng" có thể không phải là một ý tưởng tốt bởi 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?

1

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 bộ (ví dụ: DELETE FROM table WHERE id> 1 AND 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.

0

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 gì sẽ được đăng nhập vào bản ghi giao dịch. Viết vào nhật ký là lý do DELETE sẽ mất vĩnh viễn trên 5 triệu hàng. Tôi sử dụng TRUNCATE thường 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 ngay lập tức tạo cơ sở dữ liệu đầy đủ sau khi thực hiện TRUNCATE đến thiết lập cơ sở mới để khôi phục.

Tuyên bố trên được dự định để nhắc bạn đảm bảo rằng bạn hiểu rằng có sự khác biệt giữa hai loại. Thật không may, nó là kém bằng văn bản và làm cho báo cáo không được hỗ trợ như tôi đã không thực sự thực hiện bất kỳ thử nghiệm bản thân mình giữa hai. Nó dựa trên những phát biểu mà tôi đã nghe từ người khác.

Từ MSDN:

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

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

+0

Còn nếu tôi không quan tâm thêm về bảng? DROP TABLE ngụ ý DELETE hoặc TRUNCATE? Ý tôi là: Nhanh hơn để thực hiện TRUNCATE và DROP? Hoặc chỉ là một DROP? (sử dụng MSSQL-2008R4) ​​ – yucer

12

Có một huyền thoại phổ biến là 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 gọi trong một số nhận xét tại đây.Hãy xóa bỏ nó lại với nhau;)

+2

Đúng. Truncate là một "hoạt động đăng nhập tối thiểu", nhưng vẫn được ghi lại. – BradC

0

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

  • thả tất cả các chỉ số;
  • thực hiện DELETE 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 độ DELETE một chút.

3

quên cắt bớt và xóa. duy trì các đị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

Tôi sử dụng phương pháp sau đây để không ra các bảng, với phần thưởng thêm 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`; 
+0

Nhưng bạn vẫn có tất cả dữ liệu trong old_table? Tôi có thể thấy lý do tại sao điều này hữu ích - nhưng chúng tôi không muốn dữ liệu ... –

0
DELETE * FROM table_name; 

Premature tối ưu hóa có thể gây nguy hiểm. Tối ưu hóa có thể có nghĩa là làm một cái gì đó kỳ lạ, nhưng nếu nó hoạt động bạn có thể muốn tận dụng lợi thế của nó.

SELECT DbVendor_SuperFastDeleteAllFunction(tablename, BOZO_BIT) FROM dummy; 

Đối với tốc độ tôi nghĩ rằng nó phụ thuộc vào ...

  • Cơ sở dữ liệu cơ bản: Oracle, Microsoft, MySQL, PostgreSQL, những người khác, tùy chỉnh ...

  • Bảng, nội dung và các bảng có liên quan:

Có thể có các quy tắc xóa. Có một thủ tục hiện có để xóa tất cả nội dung trong bảng không? Điều này có thể được tối ưu hóa cho các cơ sở dữ liệu cụ thể cơ bản? Chúng ta quan tâm đến việc phá vỡ mọi thứ/dữ liệu liên quan như thế nào? Thực hiện một DELETE có thể là cách 'an toàn' nhất định cho rằng các bảng liên quan khác không phụ thuộc vào bảng này. Có các bảng và truy vấn khác có liên quan/phụ thuộc vào dữ liệu trong bảng này không? Nếu chúng ta không quan tâm nhiều đến bảng này xung quanh, sử dụng DROP có thể là một phương thức nhanh, một lần nữa tùy thuộc vào cơ sở dữ liệu bên dưới.

DROP TABLE table_name; 

Có bao nhiêu hàng bị xóa? Có thông tin nào khác nhanh chóng được thu hồi để tối ưu hóa việc xóa không? Ví dụ, chúng ta có thể biết bảng đã rỗng không? Chúng ta có thể nói nếu có hàng trăm, hàng ngàn, hàng triệu, hàng tỷ hàng?

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