मैं SQL सर्वर टीम पर काम करता हूं और मैं इस धागे में कुछ बिंदुओं को स्पष्ट रूप से स्पष्ट कर सकता हूं (मैंने इसे पहले नहीं देखा था, इसलिए मुझे खेद है कि इंजीनियरिंग टीम ने ऐसा पहले नहीं किया है)।
सबसे पहले, select count(1) from table
बनाम के बीच कोई शब्दार्थ अंतर नहीं है select count(*) from table
। वे सभी मामलों में समान परिणाम लौटाते हैं (और यह बग नहीं तो)। जैसा कि अन्य उत्तरों में उल्लेख किया गया है, select count(column) from table
शब्दार्थ रूप से भिन्न है और हमेशा उसी तरह के परिणाम नहीं देता है count(*)
।
दूसरा, प्रदर्शन के संबंध में, SQL सर्वर (और SQL Azure) में दो पहलू होते हैं: संकलन-समय कार्य और निष्पादन-समय कार्य। संकलन समय काम वर्तमान कार्यान्वयन में एक तुच्छ छोटी मात्रा में अतिरिक्त काम है। कुछ कॉलमों में * से सभी कॉलमों का विस्तार होता है, जिसके बाद 1 कॉलम में कमी होती है और आउटपुट और ऑप्टिमाइज़ेशन में कुछ आंतरिक ऑपरेशन काम करते हैं। मुझे संदेह है कि यह किसी भी औसत दर्जे का परीक्षण में दिखाई देगा, और यह संभवतः अन्य सभी चीजों के शोर में खो जाएगा, जो कवर के तहत होता है (जैसे कि ऑटो-स्टैटिस, एक्सवेंट सत्र, क्वेरी स्टोर ओवरहेड, ट्रिगर्स, आदि)। यह शायद कुछ हजार अतिरिक्त सीपीयू निर्देश है। इसलिए, गणना (1) संकलन के दौरान एक छोटा सा कम काम करता है (जो आमतौर पर एक बार होता है और योजना बाद के कई निष्पादन में कैश की जाती है)। निष्पादन समय के लिए, यह मानते हुए कि योजनाएं समान हैं, कोई औसत दर्जे का अंतर नहीं होना चाहिए। (पहले के उदाहरणों में से एक में अंतर दिखाई देता है - यह मशीन पर अन्य कारकों के कारण सबसे अधिक संभावना है यदि योजना समान है)।
कैसे योजना संभावित रूप से भिन्न हो सकती है। ये होने की बहुत संभावना नहीं है, लेकिन वर्तमान ऑप्टिमाइज़र की वास्तुकला में यह संभव है। SQL सर्वर का ऑप्टिमाइज़र एक खोज कार्यक्रम के रूप में काम करता है (सोचो: क्वेरी के विभिन्न भागों के लिए विभिन्न विकल्पों के माध्यम से शतरंज खेलने वाले कंप्यूटर प्रोग्राम और उचित समय में सबसे सस्ती योजना खोजने के लिए विकल्पों की कीमत चुकाना)। इस खोज की कुछ सीमाएँ हैं कि यह क्वेरी संकलन को उचित समय में पूरा करने के लिए कैसे संचालित होता है। सबसे तुच्छ से परे के प्रश्नों के लिए, खोज के चरण हैं और वे प्रश्नों के ट्रान्स से निपटते हैं जो इस आधार पर करते हैं कि कैसे अनुकूलनकर्ता को लगता है कि क्वेरी संभावित निष्पादित करना है। 3 मुख्य खोज चरण हैं, और प्रत्येक चरण किसी भी पूर्व समाधान की तुलना में सस्ती योजना खोजने की कोशिश में अधिक आक्रामक (महंगी) ह्यूरिस्टिक्स चला सकता है। अंत में, प्रत्येक चरण के अंत में एक निर्णय प्रक्रिया होती है जो यह निर्धारित करने की कोशिश करती है कि उसे अब तक मिली योजना को वापस करना चाहिए या उसे खोजते रहना चाहिए। यह प्रक्रिया अब तक मिली सबसे अच्छी योजना की अनुमानित लागत बनाम अब तक के कुल समय का उपयोग करती है। इसलिए, सीपीयू की अलग-अलग गति वाली अलग-अलग मशीनों पर यह संभव है (यद्यपि दुर्लभ) अलग-अलग योजनाओं के लिए पहले चरण में एक योजना के साथ समय समाप्त होने के कारण बनाम अगले खोज चरण में जारी है। अंतिम चरण के समय से संबंधित कुछ समान परिदृश्य भी हैं और संभवतः बहुत, बहुत महंगे प्रश्नों पर मेमोरी से बाहर चल रहे हैं जो मशीन पर सभी मेमोरी का उपभोग करते हैं (आमतौर पर 64-बिट पर समस्या नहीं है, लेकिन यह एक बड़ी चिंता थी 32-बिट सर्वर पर वापस)। अंततः, यदि आपको एक अलग योजना मिलती है, तो रनटाइम पर प्रदर्शन अलग होगा। मैं डॉन'
नेट-नेट: कृपया उन दोनों में से जो भी आप चाहते हैं, उसका उपयोग किसी भी व्यावहारिक रूप में न करें। (ईमानदारी से, इस विषय से परे एसक्यूएल में प्रदर्शन को प्रभावित करने वाले बहुत बड़े कारक हैं)।
आशा है कि ये आपकी मदद करेगा। मैंने एक पुस्तक अध्याय लिखा था कि कैसे अनुकूलक काम करता है लेकिन मुझे नहीं पता कि क्या इसे यहाँ पोस्ट करना उचित है (क्योंकि मुझे इससे छोटे रॉयल्टी मिलते हैं फिर भी मुझे विश्वास है)। इसलिए, पोस्ट करने के बजाय, मैं यूके में SQLBits में दी गई एक बात का लिंक पोस्ट करूंगा कि कैसे अनुकूलक उच्च स्तर पर काम करता है ताकि आप खोज के विभिन्न मुख्य चरणों को थोड़ा और विस्तार से देख सकें यदि आप चाहें तो उस के बारे में जानने के लिए। यहां देखें वीडियो लिंक: https://sqlbits.com/Session/Event6/inside_the_sql_server_query_optimizer