क्या MERGE tempdb का उपयोग करता है?


12

निम्नलिखित प्रश्न पर विचार करें:

MERGE [Parameter] with (rowlock) AS target
    USING (SELECT @AreaId, @ParameterTypeId, @Value)
            AS source (AreaId, ParameterTypeId, Value)
    ON (target.AreaId = source.AreaId AND 
        target.ParameterTypeId = source.ParameterTypeId)
    WHEN MATCHED THEN 
        UPDATE SET target.Value = source.Value, @UpdatedId = target.Id
    WHEN NOT MATCHED THEN
        INSERT ([AreaId], [ParameterTypeId], [Value])
        VALUES (source.AreaId, source.ParameterTypeId, source.Value);

सांख्यिकी I / O निम्नलिखित आउटपुट देता है:

तालिका 'पैरामीटर'। स्कैन काउंट 0, लॉजिकल रीड 2, फिजिकल रीड्स 0, रीड-फॉरवर्ड रीड्स 0, लॉब लॉजिकल रीड्स 0, लॉब फिजिकल रीड्स 0, लॉब रीड-फॉरवर्ड रीड्स 0.
टेबल 'एरिया'। स्कैन काउंट 0, लॉजिकल रीड्स 2, फिजिकल रीड्स 0, रीड-फॉरवर्ड रीड्स 0, लॉब लॉजिकल रीड्स 0, लॉब फिजिकल रीड्स 0, लॉब रीड-फॉरवर्ड रीड्स 0.
टेबल 'पैरामीटर'। स्कैन काउंट 1, लॉजिकल रीड 4, फिजिकल रीड्स 0, रीड-फॉरवर्ड रीड्स 0, लॉब लॉजिकल रीड्स 0, लॉब फिजिकल रीड्स 0, लॉब रीड-
फॉरवर्ड रीड्स 0. टेबल 'वर्कटेबल'। स्कैन काउंट 1, लॉजिकल रीड्स 0, फिजिकल रीड्स 0, रीड-फॉरवर्ड रीड्स 0, लॉब लॉजिकल रीड्स 0, लॉब फिजिकल रीड्स 0, लॉब रीड-फॉरवर्ड रीड्स 0।

मैसेज टैब में वर्कटेबल दिखाई देता है जिससे मुझे लगता है कि टेम्पर्डब द्वारा उपयोग किया जा रहा है MERGE

मैं निष्पादन योजना में ऐसा कुछ भी नहीं देख रहा हूं जो टेम्पर्डब की आवश्यकता का संकेत दे

MERGEहमेशा टेम्पर्ड बीडी का उपयोग करता है ?

क्या BOL में ऐसा कुछ है जो इस व्यवहार की व्याख्या करता है?

इस स्थिति में उपयोग करना INSERTऔर UPDATEतेज होगा ?

बाएं

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

सही

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

यहाँ तालिका संरचना है

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


इस योजना में स्पूल एक व्यावहारिक है tempdb। अजीब लगता है कि यह एक एकल पंक्ति के लिए है। मुझे लगता है कि यह हेलोवीन सुरक्षा के लिए हो सकता है।
मार्टिन स्मिथ

मुझे अब दिख रहा है। रिवाइंड को अनुकूलित करने के लिए इनपुट से डेटा को एक अस्थायी तालिका में संग्रहीत करता है।
क्रेग एफ्रेइन

जवाबों:


8

(सवाल पर मेरी टिप्पणी का विस्तार करते हुए।)

AreaIdऔर के संयोजन पर एक अद्वितीय बाधा के बिना ParameterTypeId, दिए गए कोड को तोड़ दिया जाता है क्योंकि @UpdatedId = target.Idकेवल कभी एक पंक्ति रिकॉर्ड करेगा Id

जब तक आप ऐसा नहीं बताते हैं, तब तक SQL सर्वर डेटा की संभावित स्थिति के बारे में नहीं जान सकता। या तो बाधा को लागू किया जाना चाहिए, या यदि कई पंक्तियां मान्य हैं , तो Idमूल्यों को आउटपुट करने के लिए एक अलग तंत्र का उपयोग करने के लिए कोड को बदलना होगा ।

इस संभावना के कारण कि स्कैन ऑपरेटर कई मिलान वाली पंक्तियों में आएगा, क्वेरी को हेलोवीन सुरक्षा के लिए सभी मैचों के लिए उत्सुक होना चाहिए। के रूप में टिप्पणी में संकेत दिया, बाधा है , तो यह वैध जोड़ने केवल एक स्कैन से योजना बदल जाएगा नहीं एक की तलाश के लिए, लेकिन यह भी तालिका स्पूल की आवश्यकता को समाप्त, के रूप में एसक्यूएल सर्वर या पता चल जाएगा या तो 0 होने जा रहा है 1 ऑपरेटर ऑपरेटर से लौटे।


6

यदि अद्यतन द्वारा स्कैन किए गए अनुक्रमणिका में पंक्ति की स्थिति बदल सकती है, तो SQL सर्वर को हेलोवीन समस्या से बचाने की आवश्यकता है । उस SQL ​​सर्वर के लिए आमतौर पर इंडेक्स स्कैन के तुरंत बाद निष्पादन योजना में एक उत्सुक तालिका स्पूल सम्मिलित करता है। वह ऑपरेटर मूल रूप से प्रश्न में पंक्तियों की एक प्रति बनाता है और यह उसके लिए tempdb का उपयोग करता है।

MERGE स्टेटमेंट के अपडेट हिस्से को समान नियमों का पालन करना होता है और ज्यादातर मामलों में एक टेबल स्पूल का उपयोग करना होता है जहां हेलोवीन सुरक्षा की आवश्यकता होती है।

हालांकि मैं यह नहीं बता सकता कि क्या यह आपकी क्वेरी में है, क्योंकि मुझे इंडेक्स डेफिनिशन (ओं) का पता नहीं है, यह सबसे अधिक संभावना है कि यहां क्या हो रहा है।

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