Là thời gian cần thiết để xây dựng lại chỉ số phụ thuộc vào mức độ phân mảnh?
Việc xây dựng lại một chỉ số bị phân mảnh 80% có mất khoảng 2 phút không nếu việc xây dựng lại cùng một chỉ mục bị phân mảnh 40% mất 1 phút?
Tôi đang yêu cầu RUNTIME (ví dụ tính bằng giây) có thể được yêu cầu để thực hiện hành động được yêu cầu, không phải về hành động nào được yêu cầu trong tình huống cụ thể. Tôi nhận thức được các thực tiễn tốt nhất cơ bản khi chỉ số reorg hoặc xây dựng lại / cập nhật thống kê nên được thực hiện.
Câu hỏi này KHÔNG hỏi về REORG và sự khác biệt giữa REORG và REBUILD.
Bối cảnh: Do thiết lập các công việc bảo trì chỉ số khác nhau (mỗi đêm, công việc nặng hơn vào cuối tuần ...) Tôi tự hỏi liệu công việc bảo trì chỉ số OFFLINE "cường độ nhẹ" hàng ngày có nên được thực hiện tốt hơn trên các chỉ mục phân mảnh trung bình thấp để giữ nhỏ thời gian - hoặc thậm chí không quan trọng và việc xây dựng lại trên một chỉ số bị phân mảnh 80% có thể mất thời gian giống như hoạt động tương tự trên cùng một chỉ mục bị phân mảnh 40%.
Tôi làm theo lời đề nghị và cố gắng tìm hiểu xem chuyện gì đang xảy ra. Thiết lập thử nghiệm của tôi: Trên máy chủ thử nghiệm KHÔNG làm gì khác và không được sử dụng bởi bất kỳ ai hoặc bất cứ thứ gì khác, tôi đã tạo một bảng có Chỉ mục cụm trên cột khóa chính của trình xác định duy nhất với một số cột bổ sung và các loại dữ liệu khác nhau [2 số, 9 datetime và 2 varchar (1000)] và chỉ cần thêm hàng. Đối với bài kiểm tra trình bày tôi đã thêm khoảng 305.000 hàng.
Sau đó, tôi đã sử dụng lệnh cập nhật và cập nhật ngẫu nhiên một phạm vi lọc hàng trên một giá trị số nguyên và thay đổi một trong các Cột VarChar với giá trị chuỗi thay đổi để tạo phân mảnh. Sau đó tôi đã kiểm tra avg_fragmentation_in_percent
mức hiện tại sys.dm_db_index_physical_stats
. Bất cứ khi nào tôi tạo phân mảnh "mới" cho điểm chuẩn của mình, tôi đã thêm giá trị này bao gồm physical_page_count
giá trị vào bản ghi của mình, sơ đồ sau được tạo bằng.
Sau đó, tôi Ran: Alter index ... Rebuild with (online=on);
và chộp lấy CPU time
bằng cách sử dụng STATISTICS TIME ON
vào bản ghi âm của tôi.
Kỳ vọng của tôi: Tôi dự kiến sẽ thấy ít nhất là dấu hiệu của một loại đường cong tuyến tính cho thấy sự phụ thuộc giữa mức độ phân mảnh và thời gian cpu.
Đây không phải là trường hợp. Tôi không chắc chắn nếu thủ tục này thực sự thích hợp cho một kết quả tốt. Có lẽ số lượng hàng / trang quá thấp?
Tuy nhiên, kết quả chỉ ra rằng câu trả lời cho câu hỏi ban đầu của tôi chắc chắn sẽ là KHÔNG . Có vẻ như thời gian cpu SQL Server cần thiết để xây dựng lại chỉ mục không phụ thuộc vào mức độ phân mảnh cũng như phụ thuộc vào Số lượng trang của chỉ mục cơ bản.
Biểu đồ đầu tiên cho thấy thời gian cpu cần thiết để REBUILD chỉ số so với mức phân mảnh trước đó. Như bạn có thể thấy đường trung bình là hằng số tương đối và hoàn toàn không có mối quan hệ nào giữa sự phân mảnh và thời gian cpu cần thiết có thể quan sát được.
Để tôn trọng ảnh hưởng có thể có của số lượng trang thay đổi trong chỉ mục sau các cập nhật của tôi có thể cần ít nhiều thời gian để xây dựng lại, tôi đã tính FRAGMENTATION LEVEL * PAGES COUNT và sử dụng giá trị này trong biểu đồ thứ hai cho thấy mối quan hệ về thời gian cpu cần thiết so với phân mảnh và số trang.
Như bạn có thể thấy, điều này cũng không chỉ ra rằng thời gian cần thiết để xây dựng lại bị ảnh hưởng bởi sự phân mảnh ngay cả khi số lượng trang thay đổi.
Sau khi đưa ra những tuyên bố đó, tôi đoán quy trình của tôi phải sai vì thời gian cpu cần thiết để xây dựng lại một chỉ số rất lớn và bị phân mảnh cao, sau đó chỉ có thể bị ảnh hưởng bởi số lượng hàng - và tôi không thực sự tin vào lý thuyết này.
Vì vậy, bởi vì tôi thực sự và chắc chắn muốn tìm hiểu điều này ngay bây giờ, bất kỳ ý kiến và đề xuất nào khác đều rất đáng hoan nghênh .