2009-11-20 35 views
9

Chúng tôi có một bảng có hơn 150 triệu bản ghi. Chúng tôi cần xóa/xóa tất cả các hàng. Thao tác xóa sẽ mất vĩnh viễn do nó ghi vào nhật ký t và chúng tôi không thể thay đổi mô hình khôi phục của mình cho toàn bộ DB. Chúng tôi đã thử nghiệm tùy chọn bảng cắt ngắn.Xóa hàng loạt (cắt ngắn và xóa)

Những gì chúng tôi nhận thấy rằng cắt bớt deallocates các trang từ bảng, và nếu tôi không sai làm cho chúng có sẵn để tái sử dụng nhưng không thu nhỏ db tự động. Vì vậy, nếu chúng ta muốn giảm kích thước DB, chúng ta thực sự cần chạy lệnh db thu nhỏ sau khi cắt bớt bảng.

Đây có phải là thủ tục bình thường không? Bất cứ điều gì chúng ta cần phải cẩn thận hoặc nhận thức về, hoặc có bất kỳ lựa chọn thay thế tốt hơn?

Trả lời

1

"Xóa tất cả các hàng" ... sẽ không DROP TABLE (và tái tái tạo là một sản phẩm nào với cùng một schema/chỉ số) là thích hợp hơn? (Cá nhân tôi thích "bắt đầu mới" ;-))

Điều này cho biết BẢNG TRUNCATE là khá OK quá, và có, DBCC SHRINKFILE có thể được yêu cầu sau đó nếu bạn muốn khôi phục không gian.

0

Một điều cần nhớ với Bảng cắt ngắn (cũng như bảng thả) đang tiến hành việc này sẽ không hoạt động nếu bạn có khóa ngoài tham chiếu bảng.

+0

Mở SQL Server, 'thả table' không thể được sử dụng nếu có ràng buộc khoá ngoại. http://msdn.microsoft.com/en-us/library/ms173790.aspx – ProKiner

+0

@prokiner bạn phải đối phó với các tham chiếu khóa ngoài bất kể điều gì, tức là liệu (các) hàng có bị xóa, thu nhỏ hoặc bị xóa hay không, bất kỳ bản ghi nào trong các bảng khác, tham chiếu (các) hàng này phải được xóa trước hoặc bị loại bỏ ràng buộc. Trong một số trường hợp, điều này có thể là "tự động" với trình kích hoạt ON DELETE, nhưng điều đó hầu như không áp dụng cho cơ sở dữ liệu loại hơn 150 triệu. – mjv

+0

@prokiner, tôi nên rõ ràng hơn.Đó là hai ý nghĩ riêng biệt, tôi đã chỉ ra vấn đề là OP đã tuyên bố rằng họ đã thử nghiệm phương pháp cắt ngắn. Tôi đã làm sạch câu trả lời của tôi. –

1

truncate là những gì bạn đang tìm kiếm. Nếu bạn cần phải giảm bớt db sau đó, chạy một thu nhỏ.

Điều này MSDN refernce (nếu bạn đang nói T-SQL) so sánh đằng sau hậu trường xóa hàng so với cắt bớt.

+0

Như các bình luận khác đã được chứng minh, bạn sẽ phải đối phó với các ràng buộc khóa ngoại của bạn (nếu có), bất kể bạn chọn cách tiếp cận nào. Sở thích của tôi là vô hiệu hóa các ràng buộc, 'cắt ngắn 'bảng, kích hoạt lại các ràng buộc của bạn, và sau đó' dbcc shirinkfile' (cung cấp cho bạn một thời gian). – ProKiner

0

Tùy thuộc vào kích thước của cơ sở dữ liệu đầy đủ, việc thu nhỏ có thể mất một thời gian; Tôi đã tìm thấy nó để đi nhanh hơn nếu nó được thu nhỏ trong khối nhỏ hơn, thay vì cố gắng để có được nó trở lại tất cả cùng một lúc.

0

Bạn có giải pháp thông thường (truncate + shrink db) để xóa tất cả các bản ghi khỏi bảng.

Như Irwin đã chỉ ra. Lệnh TRUNCATE sẽ không hoạt động khi được tham chiếu bởi ràng buộc khóa ngoài. Vì vậy, đầu tiên thả các ràng buộc, cắt ngắn bảng và tạo lại các ràng buộc.

Nếu lo ngại về hiệu suất của bạn đây là một thường xuyên thói quen cho hệ thống của bạn. Bạn có thể muốn xem xét di chuyển bảng này sang tệp dữ liệu riêng của nó, sau đó chạy chỉ thu nhỏ lại đối với tệp dữ liệu đích!

0

Như đã chỉ ra, nếu bạn không thể sử dụng truncate hoặc thả

SELECT 1 
WHILE @@ROWCOUNT <> 0 
    DELETE TOP (100000) MyTable 
+0

Anh ta có thể sử dụng cả truncate hoặc drop, tuy nhiên họ có thể cân nhắc với bất kỳ thao tác nào (xóa, thả, cắt ngắn) mà sẽ phải được xử lý. – Chad

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