Tôi biết rằng thực sự có ba loại phân mảnh mà tôi cần quan tâm khi là một DBA:
Phân mảnh chỉ mục trong các tệp dữ liệu SQL, bao gồm phân mảnh chỉ mục (bảng) phân cụm. Xác định điều này bằng cách sử dụng DBCC SHOWCONTIG (trong SQL 2000) hoặc sys.dm_ db_ index_ vật lý thống kê (trong năm 2005+).
Phân mảnh VLF bên trong các tệp Nhật ký SQL. Chạy DBCC LOGINFO để xem có bao nhiêu VLF trong mỗi tệp nhật ký SQL của bạn.
Phân mảnh tệp vật lý của các tệp cơ sở dữ liệu trên ổ cứng. Chẩn đoán điều này bằng cách sử dụng tiện ích "Disk Defragmenter" trong Windows. (lấy cảm hứng từ bài viết blog tuyệt vời này )
Rất nhiều sự chú ý được trả cho việc phân mảnh chỉ mục (xem câu trả lời Serverfault tuyệt vời này của Paul Randall), vì vậy đó không phải là trọng tâm của câu hỏi của tôi.
Tôi biết tôi có thể ngăn phân mảnh vật lý (và phân mảnh VLF) khi cơ sở dữ liệu ban đầu được tạo bằng cách lập kế hoạch tệp dữ liệu dự kiến hợp lý và kích thước nhật ký, vì phân mảnh này xảy ra thường xuyên nhất do tăng và thu nhỏ thường xuyên, nhưng tôi có một số câu hỏi về cách khắc phục phân mảnh vật lý một khi nó được xác định:
Trước hết, sự phân mảnh vật lý thậm chí có liên quan trên Enterprise SAN không? Tôi có thể / nên sử dụng Windows Defragmenter trên ổ đĩa SAN hay nhóm SAN nên sử dụng các tiện ích chống phân mảnh nội bộ? Phân tích phân mảnh tôi nhận được từ công cụ Windows có chính xác không khi chạy trên ổ SAN?
Làm thế nào lớn của một thỏa thuận là phân mảnh vật lý trên hiệu suất SQL? (Giả sử một mảng ổ đĩa nội bộ, đang chờ kết quả của câu hỏi trước.) Đây có phải là một thỏa thuận LỚN hơn so với phân mảnh chỉ mục nội bộ không? Hoặc nó thực sự là cùng một loại vấn đề (ổ đĩa phải thực hiện đọc ngẫu nhiên thay vì đọc tuần tự)
Việc chống phân mảnh (hoặc xây dựng lại) chỉ mục có lãng phí thời gian nếu ổ đĩa bị phân mảnh vật lý không? Tôi có cần sửa cái này trước khi tôi giải quyết cái kia không?
Cách tốt nhất để sửa phân mảnh tệp vật lý trên hộp SQL sản xuất là gì? Tôi biết tôi có thể tắt các dịch vụ SQL và chạy Windows Defrag, nhưng tôi cũng đã nghe về một kỹ thuật mà bạn thực hiện sao lưu toàn bộ, bỏ cơ sở dữ liệu, sau đó khôi phục từ bản sao lưu vào ổ đĩa trống. Đây có phải là kỹ thuật sau? Có phải khôi phục từ một bản sao lưu như thế này cũng xây dựng các chỉ mục từ đầu, loại bỏ phân mảnh chỉ mục nội bộ? Hoặc nó chỉ đơn giản là trả lại thứ tự trang giống như khi sao lưu được thực hiện? (Chúng tôi đang sử dụng bản sao lưu Quest Lightspeed có nén, nếu điều đó quan trọng.)
CẬP NHẬT : Các câu trả lời tốt cho đến nay về việc có nên chống phân mảnh ổ đĩa SAN (NO) hay không và liệu phân mảnh chỉ mục có còn đáng giá trên các ổ đĩa bị phân mảnh vật lý (CÓ) hay không.
Bất cứ ai khác quan tâm để cân nhắc về các phương pháp tốt nhất để thực sự chống phân mảnh? Hoặc một ước tính về khoảng thời gian bạn mong đợi sẽ mất để phân mảnh ổ đĩa bị phân mảnh lớn, giả sử là 500 GB? Rõ ràng là có liên quan, vì đó là thời gian máy chủ SQL của tôi sẽ ngừng hoạt động!
Ngoài ra, nếu bất kỳ ai có bất kỳ thông tin tổng quát nào về các cải tiến hiệu suất SQL mà bạn đã thực hiện bằng cách sửa lỗi phân mảnh vật lý, điều đó cũng sẽ rất tuyệt. Bài đăng trên blog của Mike nói về việc phát hiện ra vấn đề, nhưng không cụ thể về loại cải tiến mà nó đã thực hiện.