अस्थायी तालिका और तालिका चर के बीच INSERT प्रदर्शन अंतर


12

SQL सर्वर 2005 में मेरे पास निम्न समस्या है: कुछ पंक्तियों को एक तालिका चर में सम्मिलित करने की कोशिश में अस्थायी तालिका का उपयोग करके उसी प्रविष्टि की तुलना में बहुत समय लगता है।

यह तालिका चर में सम्मिलित करने के लिए कोड है

DECLARE @Data TABLE(...)
INSERT INTO @DATA( ... )
SELECT ..
FROM ...

यह अस्थायी तालिका में सम्मिलित करने के लिए कोड है

CREATE #Data TABLE(...)
INSERT INTO #DATA( ... )
SELECT ..
FROM ...
DROP TABLE #Data

अस्थायी तालिका में कोई कुंजी या अनुक्रमित नहीं है, चयन भाग 2 प्रश्नों के बीच समान है, और चयन द्वारा लौटाए गए परिणामों की संख्या ~ 10000 पंक्तियाँ हैं। अकेले चयन को निष्पादित करने के लिए आवश्यक समय ~ 10 सेकंड है।

अस्थायी तालिका संस्करण को निष्पादित करने में 10 सेकंड लगते हैं, मुझे 5 मिनट के बाद तालिका चर संस्करण को रोकना पड़ा।

मुझे टेबल वैरिएबल का उपयोग करना होगा क्योंकि क्वेरी टेबल वैल्यू फ़ंक्शन का हिस्सा है, जो अस्थायी तालिका तक पहुंच की अनुमति नहीं देता है।

तालिका चर संस्करण के लिए निष्पादन योजना निष्पादन योजना

अस्थायी तालिका संस्करण के लिए निष्पादन योजना निष्पादन योजना

जवाबों:


8

दो योजनाओं के बीच स्पष्ट अंतर यह है कि तेज एक समानांतर है और एक धारावाहिक धीमा है।

यह तालिका चर में सम्मिलित योजनाओं की सीमाओं में से एक है। जैसा कि टिप्पणियों में उल्लेख किया गया है (और ऐसा लगता है जैसे इसका वांछित प्रभाव था) आप ऐसा करने की कोशिश कर सकते हैं

INSERT INTO @DATA ( ... ) 
EXEC('SELECT .. FROM ...')

देखने के लिए कि सीमा के आसपास हो जाता है।


यह एक शानदार सुझाव था, हालांकि मैं हालांकि आप EXECएक फ़ंक्शन पर उपयोग नहीं कर सकते थे .... लगता है कि मैं गलत था
लामक

1
@ लमक - दोह! आप ऐसा नहीं कर सकते, यह ओपी के लिए काम नहीं करेगा। Invalid use of a side-effecting operator 'INSERT EXEC' within a function.आसपास काम हो सकता है काम यद्यपि। OPENQUERY
मार्टिन स्मिथ

आह, यह जानकर अच्छा लगा कि स्पष्टीकरण के लिए धन्यवाद
लामक

2
अंगूठे के एक सामान्य नियम के रूप में, आप टेबल चर का उपयोग नहीं करना चाहते हैं यदि आप एक बड़े डेटा को वापस पाने की उम्मीद कर रहे हैं। अस्थायी तालिकाओं में आमतौर पर तेजी से इनथिसिस मामले होते हैं।
एचएलजीईएम

1
@munissor, तब एक टेबल वैल्यू फंक्शन का उपयोग नहीं करते हैं। यदि आप बेहतर सलाह पोस्ट चाहते हैं तो आप क्या कर रहे हैं।
HLGEM

-1

टेबल चर कभी-कभी धीमे होते हैं क्योंकि टेबल चर पर कोई आँकड़े नहीं होते हैं, और इस प्रकार ऑप्टिमाइज़र हमेशा केवल एक रिकॉर्ड मानता है।

हालाँकि मैं इस बात की गारंटी नहीं दे सकता कि यहाँ ऐसा ही है, आपको टेबल वेरिएबल के लिए क्वेरी प्लान में "अनुमानित पंक्तियों" की जानकारी लेनी होगी।


टेबल चर में डालने को कैसे प्रभावित करेगा?
मार्टिन स्मिथ

ऐसा प्रतीत हो रहा है, जैसा कि आप देख सकते हैं कि समानांतर और धारावाहिक के बीच न केवल अंतर होता है, बल्कि हैश और नेस्टेड लूप में भी जुड़ जाता है, जाहिर है कि ऑप्टिमाइज़र मानता है कि जब से टेबल चर अपने दिमाग में एक रिकॉर्ड रखता है तब परिणाम क्वेरी का एक रिकॉर्ड भी होगा, एक बार फिर यह साबित करने का एकमात्र तरीका क्वेरी के प्रत्येक भाग के लिए वास्तविक आँकड़े देखना होगा, लेकिन तथ्य यह है कि टेबल चर से जुड़े सभी प्रश्न लूप जॉन्स और सीरियल प्रोसेसिंग के साथ समाप्त होते हैं, इसलिए मैं यहाँ यह संदेह करना उचित है
योएल हलब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.