2010-10-21 32 views

Trả lời

8

Sao chép các hàng bạn không muốn xóa vào bảng tạm thời bằng cách sử dụng select into và sau đó truncate bảng thay vì xóa. Sao chép các hàng trở lại vào bảng cũ. Hãy nhớ đến drop contraints trước tiên.

Nếu bạn có cột nhận dạng, sau khi thuê dữ liệu, hãy sử dụng một cái gì đó như thế này để đặt lại bảng.

declare @seed int 
select @seed = max(identity_col)+1 from tableName 
DBCC CHECKIDENT (orders, table_name, @seed) 
+0

đẹp! Tôi có các cột nhận dạng nên sẽ phải đối phó với điều đó, nhưng đó là ok. – Rory

+1

+1 - Điều này ít được đăng nhập ít nhất là 2005+ (không chắc chắn về các phiên bản trước) vì vậy nó phải siêu nhanh. Ghi nhớ thời gian cần thiết để xây dựng lại các chỉ mục. – JNK

2

Cho rằng bạn muốn xóa 90% hàng, có thể nhanh nhất là SELECT INTO 10% hàng bạn muốn giữ lại trong bảng mới.

1

Nếu bạn không thể sao chép phần còn lại để bàn khác, sau đó cắt và sao chép lại ...

... thả chỉ số là về điều duy nhất bạn có thể làm lập trình khôn ngoan. Trong trường hợp này, việc giảm chỉ mục và tái tạo chúng có thể hữu ích.

... hoặc nhận hệ thống phụ đĩa nhanh hơn, chủ yếu cho dữ liệu.

Chế độ khôi phục sẽ không trợ giúp - chế độ khôi phục cho biết nhật ký có thể xóa ngay sau khi cam kết (có thể ngầm), nhưng không có gì trong đó tránh các mục nhật ký bị ghi.

1

Thêm cờ IsDeleted (BIT), đặt thành 1 cho 90% đó và tạo chế độ xem trên bảng chỉ hiển thị các hàng có IsDeleted=0.

Xóa luôn là a) thao tác tốn nhiều tài nguyên và b) phá hủy mọi khả năng giải trình - Tôi sẽ cố gắng tránh nó nếu có thể, vì cả hai lý do (hiệu suất và hủy dữ liệu). Thay vào đó, hãy sử dụng phương pháp "xóa mềm".

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