क्यों एक तालिका के खिलाफ एक अद्यतन के साथ अद्यतन एक ट्रिगर सूचकांक सम्मिलित करते हैं, साथ ही एक संकुल सूचकांक अद्यतन करने के लिए प्रकट होता है?


10

मैं एक बहुत ही सरल उदाहरण के साथ शुरू करूँगा: दो टेबल, दोनों एक ही स्कीमा के साथ, 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ज्यादा रखा जाता है, क्योंकि लोगों को एक ट्रिगर में देखने की उम्मीद होगी।

अधिक जानकारी के लिए, मेरा लेख देखें ट्रिगर्स के INSTEAD के बारे में दिलचस्प बातें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.