SQL निष्पादन योजना में TOP ऑपरेशन क्यों है


9

थोड़ी देर की खोज के बाद, मैंने इस सवाल का जवाब देने की कमी के लिए पोस्ट करने का फैसला किया और अगर वहाँ भी इसी तरह का प्रश्न / उत्तर है तो माफी माँगता हूँ।

नीचे दिए गए क्वेरी को दो समान SQL सर्वर पर चलाते समय, हम विभिन्न निष्पादन योजनाओं का सामना करते हैं जो प्रदर्शन को प्रभावित करते हैं और हमें कारण जानने में मदद की आवश्यकता होती है।

पूछताछ:

SELECT process_id
INTO #temp
FROM revrep_revenue_fact
WHERE process_id = 284 
DROP TABLE #temp

सर्वर ए की निष्पादन योजना सर्वर बी

सर्वर बी सर्वर बी http://s2.postimg.org/z9fjrfv4n/server_B.png की निष्पादन योजना

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

यहाँ सर्वर ए और सर्वर बी के कुछ विवरण दिए गए हैं

सर्वर A और B दोनों हैं

विंडोज सर्वर 2008 आर 2 मानक सर्विस पैक 1

24 जीबी रैम

64-बिट ऑपरेटिंग सिस्टम

SQL सर्वर 2012 संस्करण का उपयोग करके प्राप्त ( चयन SERVERPROPERTY ( 'ProductVersion') )

सर्वर A SQL संस्करण 11.0.3000.0

सर्वर B SQL संस्करण 11.0.5058.0

हमने क्या प्रयास किया है

  1. समाशोधन प्रक्रिया कैश
  2. पुनर्निर्माण सूचकांक
  3. ताज़ा आंकड़े
  4. ROWCOUNT 0 सेट करें rowcount और जाने के साथ

निष्पादन योजना में सर्वर B का TOP क्यों है ? इस सरल क्वेरी उदाहरण में कोई वास्तविक समस्या नहीं है, लेकिन एक बड़ी क्वेरी में TOP के लिए लागत बढ़ जाती है और हम एक प्रदर्शन हिट देखते हैं। किसी भी मदद डिबगिंग यह बहुत सराहना की जाएगी और हम आपको कोई भी अतिरिक्त जानकारी प्राप्त कर सकते हैं जिसकी आपको मदद करने की आवश्यकता हो सकती है।


TOPऑपरेटर पता चलता है एक गैर शून्य SET ROWCOUNTपहले कि कनेक्शन पर मार डाला गया था। निष्पादित करने के बाद फिर से प्रयास करें SET ROWCOUNT 0;। साथ ही, आपके द्वारा पोस्ट किए गए SQL संस्करण SQL 2008 R2 नहीं हैं। SELECT SERVERPROPERTY('ProductVersion');वास्तविक SQL सर्वर संस्करण प्राप्त करने के लिए 2 सर्वरों पर चलाएँ ।
डैन गुज़मैन

मैंने प्रदान की गई क्वेरी का उपयोग करके sql संस्करणों के साथ मूल पोस्ट को अपडेट किया। सर्वर जो sql पर स्थापित है, विंडोज़ 2008 R2 सर्वर हैं, जबकि sql सर्वर स्थापित 2012 हैं। जैसा कि पहले किसी अन्य सदस्य ने सुझाव दिया था, तब हटा दिया गया, हमने निष्पादन योजना में कोई बदलाव नहीं के साथ ROWCOUNT को 0 पर सेट करने का प्रयास किया। अद्यतित प्रश्न देखें
आर्थर येजेयेरियन 14

क्या आप GOपंक्तिबद्ध पंक्ति के बाद रख सकते हैं । क्या आप शीर्ष ऑपरेटर के गुणों को भी पोस्ट कर सकते हैं?
रॉब फ़र्ले

रोब, ने GO को जोड़ा और गुण शीर्ष से मूल पोस्ट तक
आर्थर येजेयेरियन

जवाबों:


12

डेटाबेस संगतता स्तर 2 सर्वर पर समान है यह सुनिश्चित करने के लिए जांचें। मैंने SQL Server 2012 आवृत्ति पर एक त्वरित परीक्षण चलाया और देखें कि संगतता स्तर 100 या उससे कम है या नहीं तो TOP ऑपरेटर प्रस्तुत किया गया है। जब तक आपके पास अन्यथा करने का कोई विशिष्ट कारण नहीं है, तब तक SQL Server 2012 उदाहरण पर 110 (SQL Server 2012) संगतता स्तर का उपयोग करना सबसे अच्छा है।


2

मुझे लगता है कि आपके पास ROWCOUNT का मान है। करना:

SET ROWCOUNT 0

... इसे बंद करने के लिए।


1
SET ROWCOUNT 0 ने निष्पादन योजना से टॉप को नहीं हटाया
आर्थर येजेयेरियन

1
@ आर्थर जबकि यह आपके मामले में समाधान नहीं था , यह भविष्य के पाठकों के लिए व्यवहार का कारण हो सकता है। (क्षमा करें रोब, मैं अपनी पोस्ट undeleting क्योंकि यह वास्तव में एक ही लक्षण के लिए समस्या हो सकती है की स्वतंत्रता ले लिया।)
हारून बर्ट्रेंड

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