ทำไม UPDATE เทียบกับตารางที่มีทริกเกอร์ INSTEAD OF UPDATE ดูเหมือนว่าจะทำการแทรกดัชนีคลัสเตอร์รวมถึงการอัพเดตดัชนีคลัสเตอร์


10

ฉันจะเริ่มต้นด้วยตัวอย่างง่ายๆมาก: สองตารางทั้งคู่ด้วย schema เดียวกันทำคลัสเตอร์บน PK แต่หนึ่งในนั้นมีINSTEAD OF UPDATEทริกเกอร์:

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

ถ้าฉันดูแผนแบบสอบถามสำหรับการปรับปรุงกับตารางมาตรฐานฉันจะได้รับการปรับปรุงดัชนีที่คาดการณ์ไว้:

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

ป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามถ้าฉันทำการปรับปรุงที่คล้ายกันกับตารางด้วยทริกเกอร์ฉันจะได้รับสิ่งที่ดูเหมือนจะแทรกดัชนีคลัสเตอร์เช่นเดียวกับการปรับปรุงดัชนีคลัสเตอร์:

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

ป้อนคำอธิบายรูปภาพที่นี่

ทำไมนี้ ฉันสามารถดูการปรับปรุงดัชนีคลัสเตอร์ที่ฉันคาดไว้ในภายหลังในแผนแบบสอบถามนี้ (แบบสอบถาม # 4) แต่ทำไมฉันถึงได้รับการแทรกพิเศษนี้ที่แบบสอบถาม # 1

คำตอบ:


10

INSTEAD OFทริกเกอร์เก็บสำเนาของแถวที่จะได้รับผลกระทบในตารางการทำงานที่ซ่อนอยู่ * นี่คือการแทรกดัชนีแบบคลัสเตอร์ที่คุณเห็น ร่างกายของทริกเกอร์อ่านจากตารางการทำงานนี้ * และการเปลี่ยนแปลงข้อมูลใด ๆ ในทริกเกอร์ให้ใช้ตัวดำเนินการ 'ปกติ' (อัปเดตดัชนีแบบคลัสเตอร์ในตัวอย่างของคุณ)


* ตัวประมวลผลแบบสอบถามเปลี่ยนชื่อตารางงานภายในเมื่อสร้างรูปแบบที่ผู้ใช้มองเห็นได้ของแผนการดำเนินการ เมื่อเขียนถึงมันจะถูกเปลี่ยนชื่อเป็นตารางฐานเป้าหมายเมื่ออ่านมันจะถูกเปลี่ยนชื่อเป็นinsertedหรือdeletedมากกว่าหรือน้อยกว่าที่คนคาดว่าจะเห็นในทริกเกอร์

สำหรับรายละเอียดเพิ่มเติมโปรดดูบทความของฉันสิ่งที่น่าสนใจเกี่ยวกับแทนที่จะเรียก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.