SQL सर्वर 2012 में, (या 2005 से कोई भी संस्करण), SELECT *...
किसी क्वेरी के शीर्ष-स्तरीय चयन कथन में केवल एक संभावित प्रदर्शन समस्या है।
इसलिए यह दृश्य (*), सबक्वेरीज में SELECT COUNT(*)..
, एक्जॉस्ट क्लॉस में, सीटीई में, और न ही आदि आदि में कोई समस्या नहीं है । ध्यान दें, कि यह संभवतः Oracle, और DB2 के लिए भी सही है, और शायद PostGres (निश्चित नहीं है) , लेकिन यह बहुत संभावना है कि यह अभी भी MySql के लिए बहुत सारे मामलों में एक समस्या है।
यह समझने के लिए कि (और यह अभी भी एक शीर्ष-स्तरीय चयन में समस्या क्यों हो सकती है), यह समझने में मददगार है कि यह कभी क्यों एक समस्या थी, जिसका उपयोग यह है SELECT *..
कि " कॉलम के सभी वापस करें " का अर्थ है । सामान्य तौर पर यह बहुत अधिक डेटा लौटाएगा जो आप वास्तव में चाहते हैं, जिसके परिणामस्वरूप स्पष्ट रूप से बहुत अधिक आईओ, डिस्क और नेटवर्क दोनों हो सकते हैं।
जो कम स्पष्ट है वह यह भी बताता है कि SQL ऑप्टिमाइज़र का उपयोग करने वाले इंडेक्स और क्वेरी की योजना क्या है, क्योंकि यह जानता है कि यह अंततः सभी डेटा कॉलम को वापस करना होगा। यदि यह समय से पहले पता चल सकता है कि आप केवल कुछ कॉलम चाहते हैं, तो यह अक्सर अनुक्रमणिका का लाभ उठाकर अधिक कुशल क्वेरी योजनाओं का उपयोग कर सकता है जो केवल उन स्तंभों के पास हैं। सौभाग्य से समय से पहले इसे जानने का एक तरीका है, जो आपके लिए कॉलम सूची में वांछित कॉलम को स्पष्ट रूप से निर्दिष्ट करने के लिए है। लेकिन जब आप "*" का उपयोग करते हैं, तो आप इसके लिए "बस मुझे सब कुछ दे दो, मुझे पता चल जाएगा कि मुझे क्या चाहिए।"
हां, हर कॉलम को संसाधित करने के लिए अतिरिक्त सीपीयू और मेमोरी का उपयोग भी है, लेकिन इन दो चीजों की तुलना में यह लगभग हमेशा मामूली होता है: महत्वपूर्ण अतिरिक्त डिस्क और नेटवर्क बैंडविड्थ के लिए आवश्यक कॉलम, जिनकी आपको आवश्यकता नहीं है, और कम उपयोग करने के लिए अनुकूलित क्वेरी योजना क्योंकि इसमें हर कॉलम शामिल करना है।
तो क्या बदला? मूल रूप से, SQL ऑप्टिमाइज़र ने सफलतापूर्वक "कॉलम ऑप्टिमाइज़ेशन" नामक एक सुविधा को शामिल किया, जिसका अर्थ है कि अब वे निचले स्तर के उप-प्रश्नों में पता लगा सकते हैं यदि आप कभी भी क्वेरी के ऊपरी स्तरों में एक कॉलम का उपयोग करने जा रहे हैं।
इसका कारण यह है कि यदि आप किसी प्रश्न के निचले / भीतरी स्तरों में 'SELECT * ..' का उपयोग करते हैं तो यह कोई मायने नहीं रखता है। इसके बजाय, जो वास्तव में मायने रखता है वह यह है कि शीर्ष-स्तर के चयन की कॉलम सूची में क्या है। जब तक आप SELECT *..
शीर्ष में उपयोग नहीं करते हैं , तब तक यह एक बार फिर से मान लेना चाहिए कि आप सभी कॉलम चाहते हैं, और इसलिए स्तंभ अनुकूलन को प्रभावी ढंग से नियोजित नहीं कर सकते।
(* - ध्यान दें कि व्यूज़ में एक अलग, मामूली बाध्यकारी समस्या है, *
जहाँ वे हमेशा कॉलम सूचियों में परिवर्तन को पंजीकृत नहीं करते हैं जब "*" का उपयोग किया जाता है। इसे संबोधित करने के अन्य तरीके हैं और यह प्रदर्शन को प्रभावित नहीं करता है।)