READPAST संकेत की वजह से अनुक्रमित विचारों को अनदेखा क्यों किया जाता है?


10

मैं READPASTहमारे आवेदन के वित्तीय उपतंत्र में संसाधन लॉकिंग को कम करने के संकेत का उपयोग कर रहा हूं ।

यह जाने के लिए एक अच्छा तरीका लग रहा था क्योंकि वित्तीय लेनदेन रिकॉर्ड केवल कभी जोड़े जाते हैं, कभी अद्यतन या हटाए नहीं जाते। कभी-कभी छोड़ दी जाने वाली एकमात्र पंक्तियाँ एक लेन-देन के अंदर डाली गई बिल्कुल नई पंक्तियाँ होती हैं; वे प्रभावी रूप से बाहरी दुनिया में मौजूद नहीं हैं जब तक कि लेनदेन प्रतिबद्ध नहीं है।

हालाँकि, मैंने उन प्रश्नों पर बदतर प्रदर्शन देखा, जो अनुक्रमित विचारों का उपयोग करते हैं जो मैंने READPASTसंकेत दिया था । क्वेरी योजनाओं की तुलना करते हुए, यह संकेत के साथ जैसा दिखता है, क्वेरी ऑप्टिमाइज़र अनुक्रमित दृश्य का उपयोग नहीं करने के लिए चुनता है और इसके बजाय इसे एक नियमित दृश्य की तरह व्यवहार करने के लिए वापस आ जाता है।

मुझे यकीन नहीं है कि ऐसा क्यों होगा; मैं कल्पना करता हूं कि अनुक्रमित विचार किसी भी अन्य सूचकांक की तरह होंगे कि संचालन के दौरान चाबियाँ लॉक की जा सकती हैं और जोड़ना READPASTइसी तरह काम करेगा।

SELECT TOP 1 isa.InvoiceId
FROM Financial_InvoiceSummaryAmounts isa WITH (READPAST)
WHERE isa.TotalOwedAmount = 0.0

यहाँ छवि विवरण दर्ज करें

SELECT TOP 1 isa.InvoiceId
FROM Financial_InvoiceSummaryAmounts isa
WHERE isa.TotalOwedAmount = 0.0

यहाँ छवि विवरण दर्ज करें

एक NOEXPANDसंकेत जोड़ने के रूप में अच्छी तरह से काम करने लगता है, लेकिन मैं संभवतः इस बारे में अधिक जानने में दिलचस्पी रखता हूं READPASTकि क्वेरी ऑप्टिमाइज़र को पहली जगह में (पूर्ण उत्तर के भाग के रूप में) उस विकल्प को बनाने के लिए क्यों ।

जवाबों:


7

मेरे लेख के उदाहरण तालिका और अनुक्रमित दृश्य को पुन: उपयोग करना एंटरप्राइज़ संस्करण में संकेत का उपयोग करने का एक और कारणNOEXPAND :

CREATE TABLE dbo.T
(
    col1 integer NOT NULL
);
GO
INSERT dbo.T WITH (TABLOCKX)
    (col1)
SELECT 
    SV.number
FROM master.dbo.spt_values AS SV
WHERE 
    SV.type = N'P';
GO
CREATE VIEW dbo.VT
WITH SCHEMABINDING
AS
SELECT T.col1 
FROM dbo.T AS T;

रेप्रो

यह क्वेरी अनुक्रमित दृश्य से मेल खाती है (यद्यपि निरर्थक एग्रीगेट के साथ):

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT;

अनुक्रमित दृश्य से मेल खाता है

READPASTआधार तालिका तक पहुँचने में संकेत परिणाम जोड़ना :

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT 
    WITH (READPAST);

अनुक्रमित दृश्य मिलान नहीं किया गया

व्याख्या

READPASTसंकेत अर्थ को प्रभावित है। ऑप्टिमाइज़र पुनर्लेखन प्रश्नों का विरोध करता है जैसे कि परिणाम बदलते हैं। उदाहरण देकर स्पष्ट करने के लिए:

निम्नलिखित क्वेरी समस्याओं के बिना निष्पादित होती है:

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT 
    WITH (READPAST);

तथापि:

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT 
    WITH (READPAST)
OPTION 
    (TABLE HINT (VT, FORCESCAN));

त्रुटि उत्पन्न करता है:

एमएसजी 8722, लेवल 16, स्टेट 1, लाइन 42
क्वेरी निष्पादित नहीं कर सकता।
संकेत 'रीडपास्ट' को प्रभावित करने वाले शब्द 'वस्तु के खंड' 'वीटी' में दिखाई देते हैं
लेकिन इसी 'टेबल HINT' क्लॉज में नहीं।
विकल्प बदलें (TABLE HINTS ...) क्लॉज तो सिमेंटिक प्रभावित संकेत
क्लॉज के साथ मैच करें।

जब आप NOEXPANDसंकेत के बिना अनुक्रमित दृश्य का संदर्भ देते हैं, तो इसके बजाय अंतर्निहित वस्तुओं को संदर्भित करने के लिए दृश्य का विस्तार (संकलन और अनुकूलन शुरू होने से पहले) किया जाता है। बाद में इस प्रक्रिया में, ऑप्टिमाइज़र क्वेरी ट्री को एक अनुक्रमित दृश्य पर, पूरे या आंशिक रूप से मिलान करने पर विचार कर सकता है।

जब READPASTबिना उपयोग किया जाता है NOEXPAND, तो संकेत मिलान (विभिन्न शब्दार्थ) को रोकते हुए संकेत आधार तालिका में फैलता है।

के साथ NOEXPAND, संकेत सीधे दृश्य पर लागू होता है, इसलिए कोई समस्या नहीं है।

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