2009-04-27 34 views
14

Chúng tôi đã chạy qua một tình huống hơi kỳ quặc. Về cơ bản có hai bảng trong một trong các cơ sở dữ liệu của chúng tôi được cho ăn tấn và tấn thông tin đăng nhập mà chúng tôi không cần hoặc quan tâm. Một phần vì điều này chúng tôi đang hết dung lượng đĩa.Cách tốt nhất để xóa tất cả bảng lớn trong t-sql là gì?

Tôi đang cố gắng để làm sạch các bảng, nhưng nó dùng mãi mãi (vẫn còn 57,000,000+ hồ sơ sau khi để cho hoạt động này thông qua cuối tuần ... và đó mới chỉ là bàn đầu tiên!)

Chỉ cần sử dụng xóa Bây giờ tôi đang sử dụng một vòng lặp while để xóa các bản ghi X cùng một lúc, trong khi chơi với X để xác định cái gì thực sự nhanh nhất. Ví dụ X = 1000 mất 3 giây, trong khi X = 100.000 mất 26 giây ... mà làm toán nhanh hơn một chút.

Nhưng câu hỏi đặt ra là liệu có cách nào tốt hơn không?

(Một khi điều này được thực hiện, sẽ chạy một công việc SQL Agent đi dọn bàn ra mỗi ngày một lần ... nhưng cần nó xóa ra đầu tiên.)

+0

Bạn loại bỏ TẤT CẢ các bản ghi trong bảng? –

+0

Đây không phải là từ GFI phải không? –

+0

Tôi không biết GFI là gì ... có lẽ không. – CodeRedick

Trả lời

20

TRUNCATE bàn hoặc vô hiệu hóa các chỉ số trước khi xóa

TRUNCATE TABLE [tablename] 

Cắt ngắn sẽ xóa tất cả các bản ghi khỏi bảng mà không phải ghi từng lần xóa riêng biệt.

+1

giá trị liên kết đến http://en.wikipedia.org/wiki/Truncate_(SQL) như là một bước nhảy tắt để chắc chắn rằng họ hiểu những hạn chế nhưng hết lòng đồng tình với lời khuyên – ShuggyCoUk

+1

Nó có thể là đáng nói đến, đó là cho 'IDENTITY 'cột' TRUNCATE' có nghĩa là giá trị 'INSERT'ed tiếp theo sẽ nhận giá trị nhận dạng của' SEED' của bảng (thường là 1). Điều này có thể không phải lúc nào cũng được mong muốn. – Oliver

2
TRUNCATE TABLE [tablename] 

sẽ xóa tất cả các bản ghi mà không cần đăng nhập.

+1

nó sẽ làm một số đăng nhập tối thiểu, nó sẽ chỉ đăng nhập các trang và các phần mở rộng bị ảnh hưởng – SQLMenace

4

1) Truncate bảng

2) kịch bản ra bàn, thả và tạo lại bảng

2

Tùy thuộc vào số tiền bạn muốn giữ lại, bạn chỉ có thể sao chép các hồ sơ bạn muốn một bảng tạm thời, cắt bớt bảng đăng nhập và sao chép các bản ghi bảng tạm thời trở lại bảng nhật ký.

7

Để thêm vào các phản hồi khác, nếu bạn muốn giữ dữ liệu của ngày hôm trước (hoặc tháng trước hoặc năm trước hoặc bất kỳ thứ gì), thì hãy lưu nó đi, thực hiện TABLE TRUNCATE, sau đó chèn nó trở lại bảng gốc:

SELECT 
    * 
INTO 
    tmp_My_Table 
FROM 
    My_Table 
WHERE 
    <Some_Criteria> 

TRUNCATE TABLE My_Table 

INSERT INTO My_Table SELECT * FROM tmp_My_Table 

Điều tiếp theo cần làm là tự hỏi tại sao bạn chèn tất cả thông tin này vào nhật ký nếu không ai quan tâm. Nếu bạn thực sự không cần nó thì tắt đăng nhập tại nguồn.

+0

Phần mềm của bên thứ ba ... :( – CodeRedick

+0

Bạn có lời chia buồn của mình;) –

0

Nếu bạn có thể tìm ra x tối ưu, thao tác này sẽ liên tục lặp lại thao tác xóa ở tốc độ nhanh nhất. Đặt hàng đếm giới hạn số lượng bản ghi sẽ bị xóa trong mỗi bước của vòng lặp. Nếu logfile là quá lớn; dính một truy cập trong vòng lặp và cắt ngắn mỗi triệu hàng hoặc hơn.

bộ @@ ROWCOUNT x trong khi 1 = 1 Begin

xóa từ bảng Nếu @@ ROWCOUNT = 0 nghỉ

End

Thay đổi chế độ khai thác gỗ trên db để đơn giản hay đăng nhập hàng loạt sẽ giảm một số chi phí xóa.

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