Tại sao cơ sở dữ liệu SQL Server của tôi tăng gấp ba lần kích thước sau khi xóa hàng triệu bản ghi?


7

Chúng tôi có hai bảng cơ sở dữ liệu ErrorLogAuditcả hai đều tăng khá lớn trong vài năm qua. Vì vậy, trong nỗ lực giảm kích thước của cơ sở dữ liệu, tôi phải viết một tập lệnh để xóa tất cả các hàng cũ hơn 6 tháng từ hai bảng này.

Đây là những gì tôi nghĩ ra:

ALTER DATABASE StudioWebTest SET RECOVERY SIMPLE;

DELETE FROM [Audit] WHERE AuditDate < DATEADD(M, -6, GETDATE());
DELETE FROM [ErrorLog] WHERE ErrorDate < DATEADD(M, -6, GETDATE());

ALTER DATABASE StudioWebTest SET RECOVERY FULL;

Trên máy phát triển của tôi (SQL Server 2008 R2) có hoặc không thay đổi chế độ khôi phục, kích thước cơ sở dữ liệu tăng gấp 2-3 lần kích thước. Tuy nhiên, nếu tôi làm theo điều này ngay lập tức bằng lệnh thu nhỏ, nó sẽ cắt kích thước của cơ sở dữ liệu xuống còn một nửa kích thước ban đầu (trước khi xóa bản ghi).

Tuy nhiên, nếu tôi không thực hiện thu nhỏ trong vài ngày, thì việc thu nhỏ gần như không hiệu quả, trong khi kích thước cơ sở dữ liệu bị giảm, nó vẫn gần gấp đôi kích thước của nó (trước khi xóa các bản ghi). Không biết quá nhiều về cách SQL Server sử dụng không gian mà nó đã phân bổ, tôi cho rằng điều này có liên quan đến nó bằng cách sử dụng không gian bổ sung đã được giải phóng.

Tất cả sẽ ổn thôi trừ một điều. Khi chúng tôi chạy nó trên môi trường thử nghiệm sản xuất sử dụng SQL Server 2005, lệnh thu nhỏ không làm giảm kích thước của cơ sở dữ liệu về một nửa kích thước ban đầu.

Để thay thế, tôi cũng đã thử sử dụng TRUNCATEthay thế DELETEnhưng điều này dường như không tạo ra nhiều khác biệt. Cơ sở dữ liệu vẫn phát triển ồ ạt sau khi báo cáo hoàn thành và tôi vẫn phải thu nhỏ nó để có kết quả tương tự. Chúng tôi chưa thử điều này trên máy thử sản xuất, nhưng vì lệnh thu nhỏ dường như không cắt nó, có vẻ như nghi ngờ rằng điều này sẽ mang lại bất kỳ cải thiện nào.

Dù sao, tôi chỉ tự hỏi liệu ai đó có thể giải thích tại sao cơ sở dữ liệu phát triển quá nhiều mặc dù thay đổi cài đặt khôi phục lỗi không? điều này có thể được ngăn ngừa bằng cách nào? Hoặc có thể đề xuất một phương tiện thay thế để giảm kích thước của cơ sở dữ liệu nếu đây không phải là cách tốt nhất để thực hiện điều này.

CẬP NHẬT:

Tôi vừa mới thực hiện thêm một số thử nghiệm bằng cách sử dụng TRUNCATEnó dường như không tăng kích thước bây giờ (có thể tôi tưởng tượng ra nó). Tôi vẫn cần phải thu nhỏ cơ sở dữ liệu để xem giảm kích thước tổng thể. Tôi có thể thử điều này trên máy chủ thử nghiệm sản xuất. Vào cuối ngày, tôi nghĩ rằng các nhà quản lý của tôi sẽ hạnh phúc miễn là kích thước giảm xuống một mức độ nào đó.


2
Làm thế nào để bạn đo "kích thước cơ sở dữ liệu"? Bạn có bao gồm nhật ký trong tính toán của bạn?
Aaron Bertrand

Tôi đang nhận được kích thước từ cơ sở dữ liệu.
Nhà phát triển

Bạn đang sao lưu nhật ký giao dịch của bạn? Không phải cơ sở dữ liệu của bạn - nhật ký của bạn?
HLGEM

Câu trả lời:


12

Bạn đang thực hiện hai lần xóa khổng lồ, mỗi lần xảy ra bên trong một giao dịch ngụ ý. Mỗi bản ghi bị xóa trước tiên được ghi vào nhật ký giao dịch.

Vì bạn đã thay đổi cơ sở dữ liệu ở chế độ đơn giản, nhật ký giao dịch sẽ bị cắt ngắn trên điểm kiểm tra, nhưng bạn vẫn khiến nó phát triển trong mỗi câu lệnh xóa.

Tôi đề nghị bạn chia nhỏ các phần xóa thành khối. Trong một vòng lặp, bạn có thể xóa một ngày một lần, bắt đầu với dữ liệu cũ nhất, dừng ở mốc 6 tháng. (đảm bảo bạn có các chỉ mục hỗ trợ tiêu chí xóa của bạn, tạo chúng nếu bạn phải, bỏ chúng sau đó).

Bằng cách này, các điểm kiểm tra sẽ xảy ra thường xuyên hơn, do đó giữ cho kích thước của nhật ký giao dịch xuống mức tối thiểu.

Cắt bớt một bảng sẽ KHÔNG phát triển cơ sở dữ liệu.

Ngoài ra, trước khi bạn đưa ra các câu lệnh xóa, hãy đảm bảo bạn tìm hiểu xem có bất kỳ trình kích hoạt nào tồn tại trên bảng đó không.


1
Ditto về đợt.
jl01

Tôi sẽ cho nó đi.
Nhà phát triển
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.