Sự khác biệt giữa bảng thả và bảng cắt ngắn?


80

Tôi có một số bảng mà tôi xây dựng như một phần của bản tổng hợp báo cáo của mình. Sau đó tôi không cần chúng nữa. Ai đó đã đề cập đến việc cắt ngắn chúng vì nó sẽ nhanh hơn.


2
bạn có thể nhận được câu trả lời từ stackoverflow.com/questions/2012974/...
php

Nếu bạn cắt bớt bảng, MySQL sẽ không giải phóng dung lượng của đĩa cứng. Nếu bạn muốn bộ nhớ của mình trở lại, bạn nên bỏ bảng mà không cắt bớt nó.
Emilio Nicolás

Câu trả lời:


102

Xóa bản ghi khỏi bảng ghi lại mọi thao tác xóa và thực hiện xóa các trình kích hoạt cho các bản ghi đã bị xóa. Truncate là một lệnh mạnh hơn giúp làm trống một bảng mà không cần ghi lại từng hàng. SQL Server ngăn bạn cắt bớt một bảng có các khóa ngoại tham chiếu đến nó, vì cần phải kiểm tra các khóa ngoại trên mỗi hàng.

Truncate thường cực nhanh, lý tưởng để xóa dữ liệu khỏi bảng tạm thời. Nó bảo tồn cấu trúc của bảng để sử dụng trong tương lai.

Nếu bạn thực sự muốn xóa các định nghĩa bảng cũng như dữ liệu, chỉ cần bỏ các bảng.

Xem bài viết MSDN này để biết thêm thông tin


4
Ngoài ra, việc cắt bớt một bảng sẽ đặt lại hạt giống danh tính. Điều này có thể hữu ích trong việc kiểm tra vì bạn có thể cắt bớt bảng của mình và chèn dữ liệu và biết giá trị nhận dạng sẽ là gì mỗi lần. Bạn có thể làm điều đó nếu bạn vừa xóa tất cả dữ liệu trong bảng.
Jim


87

DROP TABLE xóa bảng.

TRUNCATE TABLE làm trống nó, nhưng để lại cấu trúc của nó cho dữ liệu trong tương lai.


4
Man, có rất nhiều hơn để nó hơn này, bạn biết;)
David Aldridge

21
Đây là điểm khác biệt chính.
ceejayoz 26/09/08

26

DROP và TRUNC làm những việc khác nhau:

BẢNG TRUNCATE

Xóa tất cả các hàng khỏi bảng mà không ghi nhật ký các lần xóa hàng riêng lẻ. TRUNCATE TABLE tương tự như câu lệnh DELETE không có mệnh đề WHERE; tuy nhiên, TRUNCATE TABLE nhanh hơn và sử dụng ít tài nguyên hệ thống và nhật ký giao dịch hơn.

DROP BẢNG

Loại bỏ một hoặc nhiều định nghĩa bảng và tất cả dữ liệu, chỉ mục, trình kích hoạt, ràng buộc và đặc tả quyền cho các bảng đó.

Đối với tốc độ có liên quan, sự khác biệt phải nhỏ. Và dù sao nếu bạn không cần cấu trúc bảng, chắc chắn sử dụng DROP.


20

Tôi nghĩ ý bạn là sự khác biệt giữa BẢNG XÓA và BẢNG TRUNCATE.

DROP BẢNG

xóa bảng khỏi cơ sở dữ liệu.

XÓA BẢNG

mà không có điều kiện xóa tất cả các hàng. Nếu có trình kích hoạt và tham chiếu thì điều này sẽ xử lý cho mọi hàng. Ngoài ra, một chỉ mục sẽ được sửa đổi nếu có.

BẢNG TRUNCATE

đặt số lượng hàng bằng 0 và không ghi nhật ký mỗi hàng. Đó là nó nhanh hơn nhiều so với cả hai.


4
set the row count zeronó thực sự đặt thành giá trị nhận dạng trở lại giá trị hạt giống nhận dạng ban đầu.
Filip De Vos

11

Không câu trả lời nào trong số này chỉ ra sự khác biệt quan trọng về hai hoạt động này. Bảng thả là một hoạt động có thể được cuộn lại. Tuy nhiên, không thể hoàn nguyên phần cắt ngắn ['BẢNG TRUNCATE' cũng có thể được cuộn lại]. Bằng cách này, việc thả một bảng rất lớn có thể rất tốn kém nếu có nhiều hàng, bởi vì tất cả chúng phải được ghi vào một khoảng trống tạm thời trong trường hợp bạn quyết định cuộn nó lại.

Thông thường, nếu tôi muốn loại bỏ một bảng lớn, tôi sẽ cắt bớt nó, sau đó bỏ nó đi. Bằng cách này, dữ liệu sẽ được xóa mà không cần ghi, và bảng có thể bị loại bỏ, và việc giảm đó sẽ rất rẻ vì không cần ghi dữ liệu.

Điều quan trọng là phải chỉ ra rằng việc cắt ngắn đó chỉ xóa dữ liệu, rời khỏi bảng, trong khi thả sẽ thực tế xóa dữ liệu và chính bảng đó. (giả sử khóa ngoại không loại trừ một hành động như vậy)


2
Điều này không hoàn toàn chính xác, TRUNCATE có thể được khôi phục lại theo nghĩa BẮT ĐẦU GIAO DỊCH, BẢNG TRUNCATE, ROLLBACK, chỉ không theo nghĩa "khôi phục nhật ký giao dịch". Nó ghi lại sự phân bổ của các trang.
Mark Sowul

1
-1 DROPvề cơ bản chỉ TRUNCATElà việc xóa siêu dữ liệu bảng khỏi các bảng hệ thống. Xem câu hỏi này tại đây
Martin Smith

5

Bảng DROP

DROP TABLE [table_name];

Lệnh DROP được sử dụng để xóa một bảng khỏi cơ sở dữ liệu. Nó là một lệnh DDL. Tất cả các hàng, chỉ mục và đặc quyền của bảng cũng sẽ bị xóa. Thao tác DROP không thể quay lại.

XÓA bảng

DELETE FROM [table_name]
WHERE [condition];

DELETE FROM [table_name];

Lệnh DELETE là một lệnh DML. Nó có thể được sử dụng để xóa tất cả các hàng hoặc một số hàng khỏi bảng dựa trên điều kiện được chỉ định trong mệnh đề WHERE. Nó được thực hiện bằng cách sử dụng khóa hàng, mỗi hàng trong bảng sẽ bị khóa để xóa. Nó duy trì nhật ký giao dịch, vì vậy nó chậm hơn TRUNCATE. Các thao tác DELETE có thể được quay lại.

Bảng TRUNCATE

TRUNCATE TABLE [table_name];

Lệnh TRUNCATE xóa tất cả các hàng khỏi bảng. Nó sẽ không ghi lại việc xóa từng hàng, thay vào đó nó ghi lại việc phân bổ các trang dữ liệu của bảng, điều này làm cho nó nhanh hơn DELETE. Nó được thực thi bằng cách sử dụng khóa bảng và toàn bộ bảng bị khóa để xóa tất cả các bản ghi. Nó là một lệnh DDL. Các hoạt động TRUNCATE không thể được hoàn nguyên.


Điều này LAF không đúng. Cắt ngắn và Thả có thể được cuộn lại. CREATE TABLE dbo.TestTruncate (ID INT) INSERT INTO dbo.TestTruncate (ID) VALUES (1) INSERT INTO dbo.TestTruncate (ID) VALUES (2) CHÈN VÀO dbo.TestTruncate (ID) GIÁ TRỊ (3) BẮT ĐẦU BẢNG TRUNCATE dbo .TestTruncate DROP TABLE dbo.TestTruncate ROLLBACK SELECT * FROM dbo.TestTruncate DROP TABLE dbo.TestTruncate
InbetweenWeekends

4

TRUNCATE TABLE giữ tất cả các chỉ mục cũ của bạn và những thứ khác. Rõ ràng là DROP TABLE sẽ loại bỏ bảng và yêu cầu bạn tạo lại nó sau đó.


3

Drop hoàn toàn thoát khỏi bảng, loại bỏ cả định nghĩa. Cắt ngắn làm trống bảng nhưng không thoát khỏi định nghĩa.


3

Cắt bớt bảng làm trống bảng. Bỏ bảng sẽ xóa hoàn toàn. Một trong hai sẽ nhanh, nhưng giảm nó có thể sẽ nhanh hơn (tùy thuộc vào công cụ cơ sở dữ liệu của bạn).

Nếu bạn không cần nó nữa, hãy bỏ nó đi để nó không làm lộn xộn lược đồ của bạn.


3

XÓA TableA thay vì TRUNCATE TableA? Một quan niệm sai lầm phổ biến là họ làm điều tương tự. Không phải vậy. Trên thực tế, có rất nhiều điểm khác biệt giữa hai điều này.

DELETE là một hoạt động được ghi trên cơ sở mỗi hàng. Điều này có nghĩa là việc xóa từng hàng sẽ được ghi lại và xóa vật lý.

Bạn có thể XÓA bất kỳ hàng nào sẽ không vi phạm một ràng buộc, trong khi vẫn giữ nguyên khóa ngoại hoặc bất kỳ quy tắc nào khác.

TRUNCATE cũng là một hoạt động được ghi lại, nhưng theo một cách khác. TRUNCATE ghi lại sự phân bổ của các trang dữ liệu trong đó dữ liệu tồn tại. Việc phân bổ các trang dữ liệu có nghĩa là các hàng dữ liệu của bạn vẫn thực sự tồn tại trong các trang dữ liệu, nhưng các phạm vi đã được đánh dấu là trống để sử dụng lại. Đây là điều làm cho TRUNCATE hoạt động nhanh hơn để thực hiện qua DELETE.

Bạn không thể TRUNCATE một bảng có bất kỳ ràng buộc khóa ngoại nào. Bạn sẽ phải loại bỏ các phần tương phản, TRUNCATE bảng và áp dụng lại các phần tương phản.

TRUNCATE sẽ đặt lại mọi cột nhận dạng về giá trị gốc mặc định.


"Việc xóa từng hàng được ghi vào nhật ký và xóa vật lý" . Bạn có chắc điều đó chính xác? Các MSDN Blog nói rằng họ không ngay lập tức bị thanh trừng. Đây là cách Postgres hoạt động.
Brad Koch

2

truncate xóa tất cả các hàng, nhưng không xóa chính bảng đó, về cơ bản nó tương đương với xóa không có mệnh đề where, nhưng thường nhanh hơn.


Việc cắt ngắn sẽ nhanh hơn vì nó không ghi lại giao dịch (tôi tin là vậy), vì vậy bạn không thể quay trở lại từ việc cắt ngắn giống như bạn có thể xóa.
Steven Murawski 25/09/08

2

Tôi có một sửa chữa cho một trong các câu trên ... "không thể cuộn lại cắt ngắn"

Cắt ngắn có thể được cuộn lại. Có một số trường hợp khi bạn không thể cắt bớt hoặc bỏ bảng, chẳng hạn như khi bạn có tham chiếu khóa ngoại. Đối với một nhiệm vụ chẳng hạn như báo cáo hàng tháng, tôi có thể chỉ bỏ bảng khi tôi không cần nó nữa. Nếu tôi thực hiện báo cáo tổng hợp này thường xuyên hơn thì thay vào đó, tôi có thể giữ bảng và sử dụng cắt ngắn.

Hy vọng điều này sẽ hữu ích, đây là một số thông tin khác mà bạn sẽ thấy hữu ích ...

Vui lòng xem chi tiết bài viết sau: http://sqlblog.com/blogs/denis_gobo/archive/2007/06/13/1458.aspx

Ngoài ra, để biết thêm chi tiết về xóa so với cắt ngắn, hãy xem bài viết này: http://www.sql-server-performance.com/faq/delete_truncate_difference_p1.aspx

Cảm ơn! Jeff


2

TRUNCATE TABLE có chức năng giống với câu lệnh DELETE không có mệnh đề WHERE: cả hai đều 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 hệ thống và nhật ký giao dịch hơn DELETE.

Câu lệnh DELETE xóa 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 xóa dữ liệu bằng cách phân bổ các trang dữ liệu được sử dụng để lưu trữ dữ liệu của bảng và chỉ các phân bổ 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 bảng, nhưng cấu trúc bảng và các cột, ràng buộc, chỉ mục, v.v. của nó vẫn còn. 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, hãy sử dụng DELETE thay thế. Nếu bạn muốn xóa đị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 TRUNCATE TABLE trên bảng được tham chiếu bởi ràng buộc NGOẠI KHÓA; thay vào đó, hãy sử dụng câu lệnh DELETE mà không có mệnh đề WHERE. Vì BẢNG TRUNCATE không được ghi, nó không thể kích hoạt một trình kích hoạt.

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

Từ http://msdn.microsoft.com/en-us/library/aa260621(SQL.80).aspx


2

Trong tiêu chuẩn SQL, bảng DROP xóa bảng và lược đồ bảng - TRUNCATE xóa tất cả các hàng.


1

Các câu trả lời ở đây phù hợp với câu hỏi, nhưng tôi sẽ trả lời câu hỏi mà bạn không hỏi. "Tôi nên sử dụng cắt ngắn hay xóa?" Nếu bạn đang xóa tất cả các hàng khỏi bảng, bạn thường muốn cắt bớt, vì nó nhanh hơn nhiều. Tại sao nó nhanh hơn nhiều? Ít nhất trong trường hợp của Oracle, nó đặt lại mốc nước cao . Về cơ bản, đây là sự tham chiếu dữ liệu và cho phép db sử dụng lại dữ liệu đó cho việc khác.


1

DELETE VS TRUNCATE

  1. Câu DELETElệnh xóa 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 TABLEloại bỏ dữ liệu bằng cách phân bổ các trang dữ liệu được sử dụng để lưu trữ dữ liệu bảng và chỉ ghi lại các phân bổ trang trong nhật ký giao dịch
  2. Chúng ta có thể sử dụng WHEREmệnh đề in DELETEnhưng trong TRUNCATEbạn không thể sử dụng nó
  3. Khi DELETEcâu lệnh được thực hiện bằng cách sử dụng khóa hàng, mỗi hàng trong bảng sẽ bị khóa để xóa. TRUNCATE TABLEluôn khóa bảng và trang nhưng không khóa từng hàng
  4. Sau khi một DELETEcâu lệnh được thực thi, bảng vẫn có thể chứa các trang trống, nếu thao tác xóa không sử dụng khóa bảng thì bảng (heap) sẽ chứa nhiều trang trống. Đối với các chỉ mục, thao tác xóa có thể để lại các trang trống, mặc dù các
    trang này sẽ được phân bổ nhanh chóng bằng quy trình dọn dẹp nền
  5. TRUNCATE TABLE loại bỏ 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, v.v. của nó vẫn còn
  6. DELETEtuyên bố không làm RESEEDcột sắc nhưng TRUNCATEtuyên bố RESEEDScác IDENTITYcột
  7. Bạn không thể sử dụng TRUNCATE TABLEtrên các bảng:
    1. Được tham chiếu bởi một FOREIGN KEYràng buộc. (Bạn có thể cắt bớt một bảng có khóa ngoại tự tham chiếu.)
    2. Tham gia vào một chế độ xem được lập chỉ mục.
    3. Được xuất bản bằng cách sử dụng sao chép giao dịch hoặc sao chép hợp nhất
  8. TRUNCATE TABLE không thể kích hoạt trình kích hoạt vì thao tác này không ghi nhật ký các lần xóa hàng riêng lẻ

1

Xóa tuyên bố

Câu lệnh Xóa xóa các hàng trong bảng và trả về số hàng bị xóa khỏi bảng. Trong câu lệnh này, chúng tôi sử dụng mệnh đề where để xóa dữ liệu khỏi bảng

  • Câu lệnh Xóa chậm hơn câu lệnh Cắt ngắn vì nó xóa từng bản ghi một

Tuyên bố cắt ngắn

Câu lệnh cắt xén Đã xóa hoặc xóa tất cả các hàng khỏi bảng.

  • Nó nhanh hơn Câu lệnh Xóa vì nó đã xóa tất cả các bản ghi khỏi bảng
  • Lệnh cắt ngắn không trả về không có hàng nào bị xóa khỏi bảng

Câu lệnh thả

Câu lệnh Drop đã xóa tất cả các bản ghi cũng như cấu trúc của bảng


1

Thả thả toàn bộ bảng và tất cả cấu trúc của nó

cắt bớt xóa tất cả các hàng khỏi bảng nó khác với xóa là nó cũng xóa chỉ mục của các hàng


0

XÓA BỎ

Lệnh DELETE được sử dụng để xóa các hàng khỏi bảng. Mệnh đề WHERE chỉ có thể được sử dụng để loại bỏ một số hàng. Nếu không có điều kiện WHERE nào được chỉ định, tất cả các hàng sẽ bị xóa. Sau khi thực hiện thao tác XÓA, bạn cần CAM KẾT hoặc QUAY LẠI giao dịch để thực hiện thay đổi vĩnh viễn hoặc hoàn tác.

TRUNCATE

TRUNCATE xóa tất cả các hàng khỏi bảng. Không thể hoàn tác thao tác ... Do đó, TRUCATE nhanh hơn và không sử dụng nhiều không gian hoàn tác như DELETE.

Từ: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.