Tại sao các chỉ mục không bao gồm của tôi sử dụng nhiều không gian hơn khi tôi xóa các hàng?


22

Tôi có một bảng lớn với 7,5 tỷ hàng và 5 chỉ mục. Khi tôi xóa khoảng 10 triệu hàng, tôi nhận thấy rằng các chỉ mục không bao gồm dường như làm tăng số lượng trang chúng được lưu trữ trên đó.

Tôi đã viết một truy vấn dm_db_partition_statsđể báo cáo sự khác biệt (sau - trước) trong các trang:

dm_db_partition_stats deltas

Chỉ số 1 là chỉ mục được nhóm, Chỉ số 2 là khóa chính. Những người khác là không độc quyền và không độc đáo.

Tại sao các trang tăng trên các chỉ mục không được nhóm?
Tôi dự đoán những con số tồi tệ nhất sẽ giữ nguyên.
Tôi thấy các bộ đếm hiệu suất báo cáo sự gia tăng số lần chia trang trong khi xóa.

Khi xóa, bản ghi ma có phải chuyển sang trang khác không? Điều này có liên quan đến "duy nhất" không?

Chúng tôi đang ở giữa triển khai RCSI, nhưng ngay bây giờ, RCSI đã tắt.

Đây là một nút chính trong một nhóm sẵn có. Tôi biết rằng ảnh chụp nhanh được sử dụng bằng cách nào đó trên các ứng dụng phụ. Tôi sẽ ngạc nhiên nếu điều đó có liên quan. Tôi dự định đào sâu vào điều này (tìm đầu ra trang dbcc) để tìm hiểu thêm. Đây là hy vọng ai đó đã nhìn thấy một cái gì đó tương tự.


Chỉ cần một câu hỏi - chạy REORGANIZE trên một trong những chỉ mục đã tăng, điều gì xảy ra? Có bao nhiêu trang bị xóa? Và nếu bạn sắp xếp lại trước khi xóa, điều gì xảy ra? Tôi chủ yếu nghĩ rằng các cơ chế nội bộ có thể thấy dễ dàng hơn trong một số trường hợp để phân bổ toàn bộ một trang mới và hợp nhất, nhưng không dọn sạch các trang trống. Tôi biết rằng REORGANIZE cuối cùng đã giảm số lượng trang đáng kể, ngay cả trên các chỉ mục tương đối không bị phân mảnh nhưng lớn hơn.
Cười Vergil

Câu hỏi hay @LaughingVergil Khi tôi có câu trả lời, tôi sẽ quay lại đây để báo cáo. (Nhưng nó có thể mất một lúc).
Michael J Swart

Trong trường hợp của chúng tôi, sự gia tăng này là một hiện tượng tạm thời. Với đủ kiên nhẫn, công việc dọn dẹp ma cuối cùng đã thực hiện công việc của nó và kích thước của các chỉ số giảm xuống.
Michael J Swart

Câu trả lời:


28

Một kịch bản có thể khiến tôi rất thích thú:

  • Các hàng ban đầu được viết khi cơ sở dữ liệu không có Snapshot Snapshot (RCSI), Snapshot Isolation (SI) hoặc Av Available Groups (AGs) được kích hoạt
  • RCSI hoặc SI đã được bật hoặc cơ sở dữ liệu đã được thêm vào Nhóm sẵn có
  • Trong quá trình xóa, dấu thời gian 14 byte đã được thêm vào các hàng đã xóa để hỗ trợ đọc RCSI / SI / AG

Vì máy chủ này là máy chủ chính trong AG, nên nó bị ảnh hưởng giống như máy chủ thứ hai. Thông tin phiên bản được thêm vào trang chính - các trang dữ liệu giống hệt nhau trên cả bản gốc và phần phụ. Những người thứ hai tận dụng cửa hàng phiên bản để đọc trong khi các hàng đang được AG cập nhật, nhưng những người thứ hai không viết các phiên bản dấu thời gian của riêng họ vào trang. Họ chỉ kế thừa các phiên bản từ công việc chính.

Để chứng minh sự tăng trưởng, tôi đã xuất khẩu cơ sở dữ liệu Stack Overflow (không bật RCSI) và tạo ra một loạt các chỉ mục trên bảng Bài viết. Tôi đã kiểm tra kích thước chỉ mục bằng sp_BlitzIndex @Mode = 2 (sao chép / dán vào bảng tính và dọn dẹp một chút để tối đa hóa mật độ thông tin):

sp_Blitz Index trước

Sau đó tôi đã xóa khoảng một nửa số hàng:

BEGIN TRAN;
DELETE dbo.Posts WHERE Id % 2 = 0;
GO

Thật thú vị, trong khi việc xóa đang diễn ra, tệp dữ liệu đang phát triển để phù hợp với dấu thời gian! Báo cáo sử dụng đĩa SSMS hiển thị các sự kiện tăng trưởng - đây chỉ là phần đầu để minh họa:

Sự kiện tăng trưởng

(Phải yêu một bản demo trong đó xóa làm cho cơ sở dữ liệu phát triển.) Trong khi xóa đang chạy, tôi đã chạy lại sp_BlitzIndex. Lưu ý rằng chỉ mục được nhóm có ít hàng hơn, nhưng kích thước của nó đã tăng khoảng 1,5 GB. Các chỉ mục không bao gồm trên AcceptedAnswerId đã tăng đáng kể - chúng là các chỉ mục trên một giá trị nhỏ hầu như không có, vì vậy kích thước chỉ mục của chúng đã tăng gần gấp đôi!

sp_Blitz Index trong khi xóa

Tôi không phải đợi xóa xong để chứng minh điều đó, vì vậy tôi sẽ dừng bản demo ở đó. Điểm đang tồn tại: khi bạn thực hiện xóa lớn trên bảng đã được triển khai trước khi RCSI, SI hoặc AG được bật, các chỉ mục (bao gồm cả cụm) thực sự có thể phát triển để phù hợp với việc thêm dấu thời gian của cửa hàng phiên bản.


3
Đây là lời giải thích. Nó chỉ ra rằng có những trường hợp khác có thể dẫn đến thiếu 14 byte phiên bản. Trong thử nghiệm của tôi, dường như việc xây dựng lại một chỉ mục ngoại tuyến sẽ xây dựng lại các hàng mà không có byte phiên bản.
Michael J Swart
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.