Hành vi của dữ liệu trong các chỉ mục dựa trên hệ số điền


14

Giả sử bạn có một cơ sở dữ liệu trong đó hệ số lấp đầy mặc định là 20. Bất cứ khi nào dữ liệu được chèn, nó chỉ tạo các trang được lấp đầy tới 20%?

Theo hiểu biết của tôi, khi dữ liệu được chèn vào, sẽ có khoảng 20% ​​dữ liệu trong các trang. Tuy nhiên, khi dữ liệu được cập nhật, nó sẽ mở rộng tới hơn 20% chỉ mục, để lấp đầy nó và tạo ra sự phân chia trang, phải không?

Câu trả lời:


16

Yếu tố điền chỉ phát huy tác dụng khi một chỉ mục được tạo hoặc xây dựng lại. Đó là lượng tiêu thụ cho chỉ mục của các trang cấp độ lá được điền trong các hoạt động này. ( xem ghi chú bên dưới để biết rõ hơn về các cấp trang bị ảnh hưởng )

Khi có một lệnh DML để dữ liệu ( INSERT, UPDATEvà / hoặc DELETE), nó sẽ xảy ra với các chỉ số bị ảnh hưởng tương ứng. Nói cách khác, nếu bạn có một trang được lấp đầy 20% và bạn chèn dữ liệu vào trang đó, trang đó sẽ chứa hơn 20% dữ liệu (ví dụ như 35% chỉ vì lợi ích). Thực hiện một thao tác chèn khác, bây giờ trang đã được điền 64%. Xây dựng lại chỉ mục và các trang cấp độ lá bây giờ sẽ tương đối chứa tỷ lệ phần trăm không gian mà bạn chỉ định (hoặc ngầm định giá trị mặc định cho máy chủ).

( Lưu ý , khi bạn không chỉ định PAD_INDEXON, hệ số lấp đầy chỉ được áp dụng cho các trang cấp độ lá. Nhưng khi bạn đặt PAD_INDEX = ON, hệ số lấp đầy sẽ được tính đến cho các trang cấp trung gian của chỉ mục. Mặc định làOFF )

Lý do để điều chỉnh hệ số lấp đầy (thay vì sử dụng 100/0 mặc định) là để bạn giảm thiểu phân tách trang khi chèn hoặc cập nhật dữ liệu. Nhưng hãy nhớ, không có gì là miễn phí. Hệ số lấp đầy càng thấp, dữ liệu không gian thường sẽ chiếm nhiều hơn. Nếu bạn giữ một không gian trang trống 80% cho các chỉ mục của mình, chúng sẽ tiêu tốn một lượng không gian đĩa tương đối lớn hơn, điều này có thể dẫn đến nhiều lượt đọc hơn.

Theo hiểu biết của tôi, khi dữ liệu được chèn vào, sẽ có khoảng 20% ​​dữ liệu trong các trang. Tuy nhiên, khi dữ liệu được cập nhật, nó sẽ mở rộng tới hơn 20% chỉ mục, để lấp đầy nó và tạo ra sự phân chia trang, phải không?

Khi dữ liệu được chèn, nó sẽ chèn vào các chỉ mục thích hợp ở trang thích hợp. Điều này rất có thể và rất có thể sẽ khiến mức tiêu thụ trang cao hơn hệ số lấp đầy.

Việc chia trang sẽ xảy ra khi dữ liệu mới được thêm vào trang chỉ mục đầy đủ. SQL Server sau đó sẽ phân chia trang và khoảng một nửa dữ liệu từ toàn bộ trang thành một trang mới. Một lần nữa, yếu tố điền không đi vào chơi ở đây.

Một lý do chính đáng để hạ thấp hệ số lấp đầy là để giảm thiểu phân tách trang, do đó giảm thiểu phân mảnh trang chỉ mục.


3
Nó cũng giảm thiểu các hoạt động IO cần thiết để phát triển hoặc phân bổ không gian.
JNK

OK, vì vậy tôi đã sai với cách hành vi làm việc. Cảm ơn bạn đã trả lời chi tiết như vậy!
DForck42

1
@ DForck42 Không có vấn đề, vui lòng giúp đỡ.
Thomas Stringer

Chúng ta có thể tóm tắt điều này để nói rằng việc đặt hệ số lấp đầy thấp sẽ có xu hướng đọc chậm (nhiều trang hơn) nhưng tốc độ chèn (ít chia tách hơn) không?
Jon của tất cả các giao dịch

2
@Jon: Với phân đoạn chỉ số fillfactor cao và đọc chậm. Đối với mỗi chỉ mục, có một fillfactor tối ưu - bên trên nó và bên dưới nó ghi và đọc chậm. Tính tối ưu phụ thuộc vào các mẫu sử dụng (số lần chèn mỗi ngày), mẫu bảo trì (tần suất xây dựng lại), dữ liệu (mức độ duy nhất là khóa). Các chỉ mục không duy nhất có xu hướng yêu cầu nhiều không gian trống hơn (fillfactor thấp hơn).
wqw
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.