Tại sao không xây dựng lại các chỉ mục với số trang <1000?


17

Tôi sử dụng tập lệnh Ola Hallengren để bảo trì Chỉ mục. Trước khi tôi làm điều đó, tôi đã sử dụng truy vấn sau để xem chỉ mục nào bị phân mảnh nhiều nhất:

SELECT dbschemas.[name] as 'Schema',
dbtables.[name] as 'Table',
dbindexes.[name] as 'Index',
indexstats.avg_fragmentation_in_percent,
indexstats.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
ORDER BY indexstats.avg_fragmentation_in_percent desc

Trong trường hợp của tôi, avg_frag sắc tố là hơn 70% cho 15 chỉ mục và hơn 30% cho 28 chỉ mục.

Vì vậy, tôi xây dựng lại mọi chỉ mục bằng giải pháp của Ola Hallengren. Khi tôi chạy lại truy vấn, đây là kết quả:

Phân mảnh trên 70% cho 12 chỉ số, trên 30% cho 15 chỉ mục.

Tôi đoán, lý do là vì page_count, thấp hơn 1000 cho mỗi chỉ số vẫn còn rất phân mảnh. Ví dụ: một trong những chỉ số có page_count 967 có tỷ lệ phân mảnh là 98,98% ! Đối với tôi, nó có vẻ đáng để xây dựng lại chỉ số đó! Tôi đã làm, và sau đó, sự phân mảnh là 0% . Ngoài ra, một chỉ số với page_count132 là từ 95% đến 0%

Vì vậy, câu hỏi của tôi là, lý do nào để KHÔNG xây dựng lại các chỉ mục đó? Một lý do có thể là việc xây dựng lại tốn chi phí thời gian và tài nguyên, nhưng vì các chỉ mục nhỏ, điều này không có nghĩa là nó tốn tương đối ít tài nguyên và dù sao nó vẫn sẽ là tốt để xây dựng lại nó?

Có nhiều câu hỏi liên quan trên trang web này, nhưng tất cả chúng đều trả lời câu hỏi tại sao một chỉ mục sẽ không phân mảnh hoặc nếu các chỉ mục vẫn hữu ích nếu chúng nhỏ và bạn không phân mảnh chúng, trong khi ở đây, câu lệnh KHÔNG làm giảm sự phân mảnh, với Câu hỏi được đặt ra, tại sao không làm điều đó?


Các chỉ mục nhỏ có khả năng được lưu trữ trong bộ nhớ. Các chỉ mục không phát sinh IO dù sao cũng không được hưởng lợi từ phân mảnh. Quy tắc đếm 1000 trang này là một heuristic.
usr

Câu trả lời:


20

Các hướng dẫn liên quan đến số lượng trang tối thiểu là hơi tùy ý . Những lợi ích lớn nhất của việc giảm phân mảnh là:

  1. Nó có thể cải thiện hiệu suất đọc trước cho quét phạm vi lớn ; và
  2. Nó có thể cải thiện mật độ trang (số lượng hàng trên mỗi trang)

Cả hai yếu tố này đều ít quan trọng đối với các chỉ số nhỏ, theo định nghĩa.

Đối số để xây dựng lại các chỉ mục nhỏ về cơ bản là:

"Tại sao phải bận tâm? Bạn không có điều gì quan trọng hơn để lo lắng?".

Điều đó nói rằng, xây dựng lại / tổ chức lại không phải là miễn phí. Có thể đáng để tránh nỗ lực thêm và tạo nhật ký trong một số trường hợp (ví dụ: nếu nhật ký được vận chuyển / sao chép qua mạng WAN vì bất kỳ lý do có thể nào - phản chiếu, nhóm khả dụng, sao chép ...). Ngoài ra, trừ khi (hoặc thậm chí nếu, trong một số trường hợp) bạn đang xây dựng lại trực tuyến, việc xây dựng lại có thể ảnh hưởng đến các quy trình đồng thời khác thông qua khóa. Cuối cùng, đối với các chỉ mục nhỏ, việc xây dựng lại thậm chí có thể không làm giảm sự phân mảnh, do phân bổ từ các phạm vi hỗn hợp (trừ khi bạn đang chạy với cờ theo dõi 1118 được bật).

Nếu bạn vẫn cảm thấy hạnh phúc hơn khi xây dựng lại các chỉ mục nhỏ này và không bận tâm đến hậu quả, thì bằng mọi cách, hãy thay đổi giá trị của @PageCountLeveltham số được chuyển sang thủ tục của Ola.

Xem bản ghi PASS TV về bài thuyết trình của Paul Randal về Chỉ số phân mảnh để biết tất cả các chi tiết.

Bạn cũng có thể muốn xem Brent Ozar nói về Tại sao Phân mảnh Chỉ mục không quan trọng trong SQL Server.

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.