Điều gì xảy ra với chỉ mục không được nhóm khi cột được bao gồm được cập nhật bằng cách sử dụng câu lệnh cập nhật?


7

Câu hỏi về chỉ mục không được nhóm với các cột được bao gồm (DB - MS SQL Server). Tôi đọc blog Bảo trì chỉ mục không phân cụm được tối ưu hóa cung cấp thông tin về các kế hoạch truy vấn khi các câu lệnh cập nhật được thực thi và chỉ mục cụm và chỉ mục không phân cụm được xác định cho bảng.
Tôi có câu hỏi về chỉ mục không cụm với các cột được bao gồm. Tôi đang tham khảo ví dụ tương tự được cung cấp bởi blogger

CREATE TABLE T (PK INT, A INT, B INT, C INT, D INT, E INT)
CREATE UNIQUE CLUSTERED INDEX TPK ON T(PK)

CREATE INDEX TB ON T(B)
CREATE INDEX TCD ON T(C,D)
CREATE INDEX TE ON T(E)

- đây là chỉ mục không phân cụm mới với các cột được bao gồm

CREATE INDEX TF ON T(E) INCLUDE(A)


INSERT T VALUES(0, 10, 20, 30, 40, 50)

UPDATE T SET A = 19

Nếu không có chỉ số TF được xác định thì chỉ cập nhật trên chỉ mục cụm sẽ được thực hiện và các thao tác chèn và xóa chỉ mục không được bao gồm sẽ không được thực hiện. Nhưng điều gì sẽ xảy ra khi TF được xác định?

Câu trả lời:


4

Bài đăng blog bạn tham khảo cũng chỉ ra cách bạn có thể tự trả lời điều này.

Nếu bạn thực thi

SET SHOWPLAN_TEXT ON;
GO
UPDATE T SET A = 19;

Kế hoạch như thế nào

  |--Clustered Index Update(OBJECT:([AdventureWorks2008].[dbo].[T].[TPK]), OBJECT:([AdventureWorks2008].[dbo].[T].[TF]), SET:([AdventureWorks2008].[dbo].[T].[A] = [@1]))
       |--Compute Scalar(DEFINE:([Expr1009]=[Expr1009]))
            |--Compute Scalar(DEFINE:([Expr1009]=CASE WHEN CASE WHEN [AdventureWorks2008].[dbo].[T].[A] = [@1] THEN (1) ELSE (0) END THEN (0) ELSE (1) END))
                 |--Top(ROWCOUNT est 0)
                      |--Index Scan(OBJECT:([AdventureWorks2008].[dbo].[T].[TF]), ORDERED FORWARD)

hiển thị một kế hoạch cho mỗi hàng / hẹp trong đó chỉ mục TFđược liệt kê là một trong những đối tượng được cập nhật.


Sau khi thực hiện câu lệnh "update T set A = 20" leaf_update_count được thay đổi thay vì leaf_insert_count. Nó có nghĩa là khi cập nhật được thực hiện trên cột được bao gồm thì nút lá không được nhóm được cập nhật. Nó không thực hiện xóa và sau đó chèn hoạt động. index_id leaf_insert_count leaf_update_count 5 0 1
Delta

@Delta - Vì vậy, TFcó indexid là 5 và của nó leaf_update_count = 1(đó là phản ứng với phiên bản bình luận trước đó). Và vâng đó là những gì tôi mong đợi cho một cột được bao gồm. Xóa / Chèn thường xảy ra nếu bạn cập nhật một cột chính vì nó có thể cần phải di chuyển. ví dụ: thửUPDATE T SET E = 25
Martin Smith

Có 5 là id chỉ mục cho TF và leaf_update_count = 1. Khi tôi truy vấn giá trị leaf_delete_count và non_leaf_delete_count cho bảng, hai cột này có 0 giá trị. Thật khó hiểu tại sao chỉ cần chèn số lượng được cập nhật chứ không phải số đếm xóa.
Đồng bằng

@Delta - Nhìn kìa leaf_ghost_count. Hồ sơ được đánh dấu là ma trước sau đó được làm sạch sau.
Martin Smith

bạn có nghĩa là xóa_count không bao giờ chứa số lượng đã xóa trong khi các bóng ma chứa các giá trị này và sau đó chúng cũng được dọn sạch?
Đồng bằng

4

Giống như khi bạn cập nhật một giá trị trong một chỉ mục được lưu trữ trong các trang lá và không lá, tất cả các trang đó đều được cập nhật với giá trị mới. Các cột được lưu trữ ở cấp độ lá chỉ thông qua bao gồm được cập nhật khi bạn cập nhật giá trị. Điều này cũng có thể dẫn đến việc chia tách spage.


2

Nếu TF được xác định, nó sẽ phải được cập nhật. Điều này là do giá trị của A được bao gồm trên cấp độ lá TF. Một bản cập nhật trên cột A sẽ phải phản ánh giá trị này trên chỉ số TF.

Đây là lý do bạn có chỉ số TF bao gồm, do đó bạn sẽ không phải tìm kiếm trên A, khi bạn chỉ cần các cột E hoặc A.

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.