Nén trên một đống


14

Sau đây là một đoạn từ Microsoft Docs :

Các trang mới được phân bổ trong một đống như một phần của các hoạt động DML sẽ không sử dụng nén PAGE cho đến khi heap được xây dựng lại. Xây dựng lại heap bằng cách loại bỏ và áp dụng lại nén, hoặc bằng cách tạo và xóa một chỉ mục được nhóm.

Tôi không thể hiểu tại sao đây là trường hợp. Nếu tôi có một đống với cài đặt nén được chỉ định, tại sao nó không được áp dụng cho một trang thuộc về bảng?

Cảm ơn

Câu trả lời:


12

Mặc dù tôi không biết (các) cơ chế nội bộ cụ thể chịu trách nhiệm cho sự khác biệt, tôi có thể nói rằng Heaps được quản lý (bên trong) hơi khác so với Chỉ mục được nhóm (và có thể cả Chỉ mục không tách rời):

  • Xóa các hàng khỏi Heap sao cho một hoặc nhiều trang dữ liệu trống (không có hàng được phân bổ) không nhất thiết phải giải phóng không gian đó. Bạn có thể sẽ cần phải tạo và sau đó thả Chỉ mục cụm trên bảng hoặc gọi ALTER TABLE [TableName] REBUILD;(kể từ SQL Server 2014?). Vui lòng xem trang Microsoft Docs để XÓA để biết thêm chi tiết và các tùy chọn.

  • Chèn các hàng riêng lẻ (nghĩa là không dựa trên tập hợp INSERT) vào Heap sẽ không lấp đầy các trang dữ liệu như với Chỉ mục cụm. Các chỉ mục được nhóm sẽ phù hợp với các hàng miễn là có không gian cho hàng (dữ liệu và chi phí hàng) cộng với tổng phí 2 byte của mảng vị trí. Tuy nhiên, các trang dữ liệu trong Heaps không sử dụng số byte còn lại trên trang mà thay vào đó sử dụng một chỉ báo rất khái quát về mức độ đầy đủ của trang và không có nhiều mức được báo cáo. Các mức là một cái gì đó dọc theo các dòng: 0%, 20%, 50%, 80% và đầy đủ 100%. Và nó sẽ chuyển sang 100% trong khi vẫn còn khoảng trống cho một hàng khác (và trên thực tế, nếu cùng một số hàng được chèn trong một hoạt động dựa trên tập hợp, thì nó sẽ lấp đầy trang càng nhiều càng tốt). Tất nhiên, giống như vớiDELETE các hoạt động, xây dựng lại Heap sẽ đóng gói càng nhiều hàng càng phù hợp với trang dữ liệu.

Bây giờ hãy xem xét các thông tin sau, được lấy từ phần "Khi xảy ra nén trang" trên trang Microsoft Docs để thực hiện nén trang :

... Khi dữ liệu được thêm vào trang dữ liệu đầu tiên, dữ liệu được nén theo hàng. ... Khi trang đầy, hàng tiếp theo được thêm sẽ bắt đầu thao tác nén trang. Toàn bộ trang được xem xét; ...

Do đó, dường như hoàn toàn phù hợp với hành vi Heap khác này mà họ sẽ yêu cầu ALB TABLE REBUILD, CREATE / DROP của Clustered Index hoặc thay đổi trong cài đặt Nén dữ liệu (tất cả đều xây dựng lại vùng heap) trước khi các trang dữ liệu được viết tối ưu Nếu Heaps không nhận thức đầy đủ về "toàn bộ trang" (cho đến khi Heap được xây dựng lại) và không biết khi nào trang chắc chắn là đầy đủ, thì họ sẽ không biết khi nào nên bắt đầu thao tác nén trang (khi xử lý các bản cập nhật và đơn -row chèn).

Một kỹ thuật khác sẽ hạn chế hơn một số Heap khỏi việc nén Trang tự động (ngay cả khi chúng có thể) là việc áp dụng nén sẽ yêu cầu tất cả các Chỉ mục không được bao gồm cho Heap đó (nếu có tồn tại) được xây dựng lại. Như trang được liên kết cho "Nén dữ liệu" cũng nêu:

Thay đổi cài đặt nén của heap yêu cầu tất cả các chỉ mục không được bao gồm trên bảng phải được xây dựng lại để chúng có các con trỏ tới các vị trí hàng mới trong vùng heap.

"Con trỏ" đang được gọi là ID hàng (RID), là sự kết hợp của: FileID, PageID và vị trí / vị trí trên trang. Các RID này được sao chép vào các Chỉ mục không bao gồm. Là một vị trí vật lý chính xác, đôi khi chúng tìm kiếm nhanh hơn so với di chuyển qua cây b với các phím Indexed Clustered. Nhưng, một nhược điểm của một vị trí vật lý là nó có thể thay đổi, và đó là vấn đề ở đây. Tuy nhiên, các Chỉ mục được nhóm không gặp phải vấn đề này vì các giá trị Khóa của chúng được sao chép vào các Chỉ mục không tách rời khi con trỏ trở lại Chỉ mục được nhóm. Và các giá trị Key vẫn giữ nguyên, ngay cả khi vị trí vật lý của chúng thay đổi.

Cũng thấy:

  • phần "Quản lý vùng heaps" của trang Microsoft Docs cho Heaps (Bảng không có chỉ mục được nhóm) :

    Để xây dựng lại một đống để lấy lại không gian bị lãng phí, hãy tạo một chỉ mục được nhóm trên heap, sau đó bỏ chỉ mục được nhóm đó.

  • phần "Cân nhắc khi bạn sử dụng nén hàng và nén trang" của trang Microsoft Docs để nén dữ liệu :

    Khi một heap được cấu hình để nén cấp trang, các trang chỉ nhận được nén cấp trang theo các cách sau:

    • Dữ liệu được nhập số lượng lớn với tối ưu hóa hàng loạt được kích hoạt.
    • Dữ liệu được chèn bằng cú pháp INSERT INTO ... VỚI (TABLOCK) và bảng không có chỉ mục không bao gồm.
    • Một bảng được xây dựng lại bằng cách thực hiện câu lệnh ALTER TABLE ... REBUILD với tùy chọn nén PAGE.

    Và tuyên bố trích dẫn trong câu hỏi.


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.