Phân mảnh có nghĩa là gì trong một đống
Giá trị phân mảnh trong Heap mà bạn nhận được từ cột avg_fragmentation_in_percent
bằng cách truy vấn sys.dm_db_index_physical_stats
các trạng thái DMV
Phân mảnh logic cho các chỉ mục hoặc phân mảnh phạm vi cho các đống trong đơn vị phân bổ IN_law_DATA.
Hơn nữa BOL nói rằng
Đây là tỷ lệ phần trăm không theo thứ tự trong các trang lá của một đống. Phạm vi không theo thứ tự là một phạm vi mà phạm vi chứa trang hiện tại cho một heap không phải là phạm vi tiếp theo sau phạm vi chứa trang trước đó.
Vì vậy, bạn có thể thấy đó không phải là không gian trống có trong các trang được phân bổ cho Heap mà là các chuỗi trang khác nhau tạo ra sự phân mảnh.
Điều này có thể được chứng minh bằng thử nghiệm nhỏ. Hãy để chúng tôi tạo Bảng Heap và chèn một số bản ghi vào đó và sau đó kiểm tra sự phân mảnh.
create table dbo.HeapTest
(
Id INT not NULL Default (1),
Col1 char(5000) Not null Default ('Heaps Are Cool')
)
SET NOCOUNT ON
Insert into dbo.Heaptest default values
go 50
select index_type_desc,avg_fragmentation_in_percent,fragment_count,
avg_page_space_used_in_percent,record_count
from sys.dm_db_index_physical_stats(db_id(),object_id('dbo.HeapTest','U'),0,default,'detailed')
Vì vậy, bảng Heap được tạo với 50 bản ghi trong đó. Dưới đây là sự phân mảnh trông như thế nào sau khi truy vấn DMV sys.dm_db_index_physical thống kê
Bạn có thể thấy avg_fragmentation_in_percent
giá trị cột là 33%. Bây giờ chúng ta hãy xem các trang được sắp xếp như thế nào. Điều này có thể được thực hiện bằng cách sử dụng truy vấn không có giấy tờ%%lockres%%
. Các truy vấn sẽ là
SELECT %%lockres%%, * FROM dbo.HeapTest;
Và dưới đây là những gì đầu ra trông như thế nào. Chỉ đính kèm phần có liên quan của nó. Truy vấn tạo ra 50 hàng kể từ khi chúng tôi chèn 50 hàng trong bảng dbo.HeapTest của chúng tôi.
Những gì nó nói là trang đầu tiên có ID 197
, trang tiếp theo có ID Các 242
trang tiếp theo có ID liên tục cho đến khi chúng tôi đạt được ID trang 264
vì sau đó chúng tôi nhận được ID trang 280
. Vì vậy, bước nhảy trong số ID trang này là những gì thực sự gây ra sự phân mảnh.
Bây giờ kẻo xây dựng lại heap và chạy lại lệnh để xem sự phân mảnh và cách các trang được sắp xếp. Chúng tôi nhận được phân mảnh như
Bạn có thể thấy sự phân mảnh là bây giờ 14%
.
Hãy cho chúng tôi xem số trang được phân bổ
Chúng tôi chỉ có một bước nhảy còn lại tất cả các trang được phân bổ ID trang một cách thanh thản. Vì chỉ một phân đoạn nhảy giảm đáng kể.
Tôi xây dựng lại Heap một lần nữa và bây giờ khi tôi kiểm tra sự phân mảnh thì nó đã hoàn toàn biến mất. Và phân bổ ID trang giống như
Tại sao phân mảnh tăng
Bây giờ liên quan đến những gì có thể gây ra sự phân mảnh tăng lên, chúng ta có thể chứng thực rằng khi các trang được phân bổ cho heap chúng sẽ không liên tục, như bạn đã thấy ở trên, điều gì khiến giá trị phân mảnh tăng lên đã nhảy vào ID PAGE được phân bổ cho các trang.
Ở phía sau đầu bạn cũng nên nhớ rằng phân mảnh từ cho HEAP không có nghĩa gì, làm thế nào bạn xác định phân mảnh cho một loạt các trang không theo thứ tự.
Thực sự lo lắng về sự phân mảnh
Nếu bạn thực sự phải đối mặt với một kịch bản trong đó bảng heap bị phân mảnh và làm chậm các truy vấn, tốt hơn là tạo một chỉ mục được nhóm trên bảng hơn là xây dựng lại nó. Lý do là khi bạn xây dựng lại heap tất cả các chỉ mục Non Clustered cơ bản cũng được xây dựng lại khiến quá trình xây dựng lại mất nhiều thời gian hơn, sử dụng nhiều tài nguyên và nhật ký giao dịch đầy hơi. Trên một hệ thống sản xuất, người ta luôn cố gắng tránh điều này. Paul đã đề cập đến điều này trong mục Huyền thoại về đống .
PS: Vui lòng không sử dụng lệnh không có giấy tờ trên hệ thống sản xuất. Đây chỉ là để trình diễn.