Tại sao một CẬP NHẬT đối với một bảng có trình kích hoạt INSTEAD OF UPDATE xuất hiện để thực hiện chèn chỉ mục cụm, cũng như cập nhật chỉ mục cụm?


10

Tôi sẽ bắt đầu với một ví dụ rất đơn giản: hai bảng, cả hai bảng có cùng một lược đồ, được nhóm trên PK, nhưng một trong số đó có một trình INSTEAD OF UPDATEkích hoạt:

CREATE TABLE Standard
(
    PK  UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED,
    V   INT NOT NULL
)
GO

CREATE TABLE InsteadOf
(
    PK  UNIQUEIDENTIFIER PRIMARY KEY CLUSTERED,
    V   INT NOT NULL
)
GO

INSERT Standard (PK, V) VALUES ('1E58B555-B073-471E-B576-4B09C8E18976', 0)
INSERT InsteadOf (PK, V) VALUES ('1E58B555-B073-471E-B576-4B09C8E18976', 0)
GO

CREATE TRIGGER TR_InsteadOf_Update ON InsteadOf INSTEAD OF UPDATE
AS
BEGIN
    DECLARE @PK UNIQUEIDENTIFIER
    DECLARE @V INT
    DECLARE @cursor CURSOR
    SET @cursor = CURSOR FOR SELECT PK, V FROM Inserted
    OPEN @cursor

    FETCH NEXT FROM @cursor INTO @PK, @V
    WHILE @@FETCH_STATUS = 0
    BEGIN
        UPDATE InsteadOf SET
            V = @V
        WHERE PK = @PK

        FETCH NEXT FROM @cursor INTO @PK, @V
    END
    CLOSE @cursor
    DEALLOCATE @cursor

END
GO

Nếu tôi xem kế hoạch truy vấn cho một bản cập nhật so với bảng tiêu chuẩn, tôi sẽ nhận được bản cập nhật chỉ mục được mong đợi:

UPDATE Standard SET
    V = 1
    WHERE PK = '1E58B555-B073-471E-B576-4B09C8E18976'

nhập mô tả hình ảnh ở đây

Tuy nhiên, nếu tôi thực hiện một bản cập nhật tương tự với bảng với trình kích hoạt, tôi sẽ nhận được thứ dường như là một chỉ mục chèn cụm, cũng như cập nhật chỉ mục được nhóm:

UPDATE InsteadOf SET
    V = 1
    WHERE PK = '1E58B555-B073-471E-B576-4B09C8E18976'

nhập mô tả hình ảnh ở đây

Tại sao lại thế này? Tôi có thể thấy cập nhật chỉ mục được nhóm mà tôi mong đợi sau này trong kế hoạch truy vấn này (truy vấn số 4), nhưng tại sao tôi lại có thêm phần bổ sung này tại truy vấn số 1?

Câu trả lời:


10

Một INSTEAD OFkích hoạt lưu trữ một bản sao của các hàng sẽ bị ảnh hưởng trong một bảng làm việc ẩn *. Đây là Chỉ số cụm được chèn mà bạn thấy. Phần thân kích hoạt đọc từ bảng công việc này * và mọi thay đổi dữ liệu trong trình kích hoạt đều sử dụng toán tử 'bình thường' (Cập nhật chỉ mục cụm trong ví dụ của bạn).


* Bộ xử lý truy vấn bên trong đổi tên bảng làm việc khi xây dựng hình thức người dùng có thể nhìn thấy của kế hoạch thực hiện. Khi viết đến nó, nó được đổi tên vào bảng cơ sở mục tiêu, khi đọc sách, nó được đổi tên thành insertedhoặc deletednhiều hơn hoặc ít hơn như mọi người sẽ mong đợi để xem trong một cò.

Để biết thêm chi tiết, hãy xem bài viết của tôi Những điều thú vị về kích hoạt INSTEAD OF .

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.