Tôi có một số bảng với số lượng hàng trong khoảng từ 5M đến 1.5G
Mỗi bảng có trường BLOB, kích thước thay đổi từ 100 byte đến 30 MB và được lưu trữ dưới dạng 'loại giá trị lớn ngoài hàng' = ON
Các bảng được lưu trữ trong các nhóm fileg khác nhau với 3-4 tệp mỗi tệp trên các đĩa khác nhau @ LUNs khác nhau @ SAN rất nhanh
Mỗi ngày các bảng này phát triển với kích thước 5 - 100 Gb và với các hàng 600k - 1,5M
Sau một khoảng thời gian nhất định , thay đổi từ 2 tuần đến 6 tháng, một số hàng bị xóa hoặc chuyển sang lưu trữ DB, vì vậy - không có bất kỳ hàng nào trong các bàn làm việc cũ hơn 6 tháng.
Cấu hình hiện tại của máy chủ:
- Công cụ máy chủ SQL là 2008 R2 SP1 Enterprise @ 24 lõi, RAM 64Gb
- SQL Server chạy với các cờ khởi động thêm:
-T 3640; (Loại bỏ việc gửi tin nhắn DONE_IN_PROC cho khách hàng cho mỗi câu lệnh trong quy trình được lưu trữ. Điều này tương tự như cài đặt phiên của SET NOCOUNT ON, nhưng khi được đặt làm cờ theo dõi, mọi phiên của khách hàng sẽ được xử lý theo cách này)
-T 1118; (Chuyển phân bổ trong tempDB từ 1pg tại một thời điểm (cho 8 trang đầu tiên) sang một mức độ.)
-T 2301; (Cho phép tối ưu hóa nâng cao dành riêng cho các truy vấn hỗ trợ quyết định. Tùy chọn này áp dụng cho xử lý hỗ trợ quyết định của các tập dữ liệu lớn)
-T 1117; (Phát triển tất cả các tệp dữ liệu cùng một lúc, khác đi theo lượt.)
-E; (Tăng số lượng phạm vi được phân bổ cho mỗi tệp trong nhóm fileg. Tùy chọn này có thể hữu ích cho các ứng dụng kho dữ liệu có số lượng người dùng hạn chế chạy chỉ mục hoặc quét dữ liệu)
-T 834; (Làm cho SQL Server sử dụng phân bổ trang lớn của Windows cho bộ nhớ được phân bổ cho nhóm bộ đệm, http://msdn2.microsoft.com/en-us/l Library / aa366720.aspx , http://support.microsoft. com / kb / 920093 )
- SQL Server sử dụng tiện ích mở rộng trang lớn
- SQL Server sử dụng tùy chọn khởi tạo tệp nhanh
- AUTOSHRINK TẮT cho tất cả các cơ sở dữ liệu
Vấn đề là - bắt đầu từ một số thời gian hoạt động của máy chủ (từ vài ngày đến vài tháng) GHOST CLEANUP
từ chối thực hiện các công việc dọn dẹp bắt buộc và chỉ đơn giản là thực hiện công việc thông thường của nó - dọn sạch vài trang trong vài giây ( which is seen thru Extended Events
), không phù hợp , bởi vì nó không thể dọn sạch tất cả các hàng đã xóa
Vấn đề vẫn tồn tại từ thời SQL Server 2005 RTM Enterprise
Làm thế nào tôi đã cố gắng giải quyết vấn đề:
- Đã thử buộc các hoạt động SCAN trên các chỉ mục được nhóm của các bảng
- Đã thử buộc các hoạt động SCAN, liên quan đến tất cả nội dung của cột BLOB trên các chỉ mục được nhóm của các bảng
- hệ thống sp_clean_db_free_space & sp_clean_db_file_free_space
- dọn dẹp dbcc thủ công (@dbid, @fileid, @page) cho tất cả các tệp và trang trong DB
- xây dựng lại chỉ mục cụm và tổ chức lại
- tái tạo cơ sở dữ liệu
DBCC FORCEGHOSTCLEANUP
Khi tôi chạy truy vấn:
select * from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')
Tôi thấy hàng triệu và hàng chục triệu bản ghi ma, nhưng chỉ dành cho loại đơn vị phân bổ LOB_DATA
Những điều duy nhất, giúp đỡ:
- dừng máy chủ bằng lệnh SHUTDOWN hoặc khởi động lại toàn bộ máy chủ - điều đó giúp ích, sau khi khởi động lại quy trình GHOST CLEANUP chạy vài giờ và thực sự xóa tất cả các bản ghi bị bóng ma
- DBCC SHRINKFILE với tùy chọn EMPTYFILE - di chuyển tất cả dữ liệu từ tệp này sang tệp khác hoặc tệp mới tạo chỉ xóa các bản ghi ma trong tệp này - vấn đề là tôi thực sự ghét các hoạt động thu nhỏ. Và việc này mất 3-4 ngày cho MỘT tệp
câu hỏi - có tồn tại bất kỳ cách lập trình (thích hợp) hoặc bảo trì nào để buộc GHOST CLEANUP không có thời gian ngừng hoạt động của máy chủ không, vì thời gian ngừng hoạt động của máy chủ tốn quá nhiều, thậm chí không thể chấp nhận được - từ hàng ngàn đến hàng chục nghìn đô la mỗi giờ
Các vấn đề đã được chú ý như tôi đang ở đây:
- http://support.microsoft.com/kb/932115
- http://www.sqlservercentral.com/Forums/Topic496244-149-1.aspx
Và cũng giống như vậy ở đây: