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.
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.
Câu trả lời:
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
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.
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.
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.
set the row count zero
nó 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.
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)
DROP
về cơ bản chỉ TRUNCATE
là 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
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.
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.
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.
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 đó.
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.
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.
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
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
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.
DELETE
lệ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 TABLE
loạ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ịchWHERE
mệnh đề in DELETE
nhưng trong TRUNCATE
bạn không thể sử dụng nóDELETE
câ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 TABLE
luôn khóa bảng và trang nhưng không khóa từng hàngDELETE
câ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 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ònDELETE
tuyên bố không làm RESEED
cột sắc nhưng TRUNCATE
tuyên bố RESEEDS
các
IDENTITY
cộtTRUNCATE TABLE
trên các bảng:
FOREIGN KEY
ràng buộc. (Bạn có thể cắt bớt một bảng có khóa ngoại tự tham chiếu.)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ẻ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
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.
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
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