आपके विनिर्देशन को देखते हुए कि आप सभी कॉलमों का चयन कर रहे हैं, इस समय थोड़ा अंतर है । हालांकि, एहसास है कि डेटाबेस स्कीमा परिवर्तन करते हैं। यदि आप उपयोग SELECT *
करते हैं तो आप किसी भी नए कॉलम को तालिका में शामिल करने जा रहे हैं, भले ही सभी संभावना में, आपका कोड उस नए डेटा का उपयोग करने या प्रस्तुत करने के लिए तैयार नहीं है। इसका मतलब है कि आप अपने सिस्टम को अप्रत्याशित प्रदर्शन और कार्यक्षमता में बदलाव के लिए उजागर कर रहे हैं।
आप इसे मामूली लागत के रूप में खारिज करने के लिए तैयार हो सकते हैं, लेकिन यह महसूस करें कि उन स्तंभों की आवश्यकता है जो आपको अभी भी होने चाहिए:
- डेटाबेस से पढ़ें
- नेटवर्क में भेजा गया
- आपकी प्रक्रिया में शामिल किया गया
- (ADO- प्रकार प्रौद्योगिकियों के लिए) डेटा-टेबल इन-मेमोरी में सहेजा गया
- अनदेखा और त्याग / कचरा-एकत्र
आइटम # 1 में कई संभावित कवर इंडेक्स को समाप्त करने सहित कई छिपी हुई लागतें हैं, जिससे डेटा-पेज लोड (और सर्वर कैश थ्रेशिंग) होता है, जिससे पंक्ति / पृष्ठ / टेबल लॉक को अन्यथा से बचा जा सकता है।
बनाम *
और एक ही संभावित बचत कॉलम को निर्दिष्ट करने की संभावित बचत के खिलाफ इसे संतुलित करें :
- प्रोग्रामर को कॉलम जोड़ने के लिए SQL को फिर से चालू करने की आवश्यकता नहीं है
- SQL का नेटवर्क-ट्रांसपोर्ट छोटा / तेज होता है
- SQL सर्वर क्वेरी पार्स / सत्यापन समय
- SQL सर्वर क्वेरी योजना कैश
आइटम 1 के लिए, वास्तविकता यह है कि आप किसी भी नए कॉलम का उपयोग करने के लिए कोड जोड़ने / बदलने के लिए जा रहे हैं, इसलिए यह धो सकता है।
आइटम 2 के लिए, अंतर शायद ही आपको किसी पैकेट-आकार या नेटवर्क पैकेट की संख्या में धकेलने के लिए पर्याप्त है। यदि आप उस बिंदु पर पहुँचते हैं जहाँ SQL कथन संचरण समय प्रमुख मुद्दा है, तो आपको संभवतः पहले कथनों की दर को कम करना होगा।
आइटम 3 के लिए, *
वैसे भी होने वाले विस्तार के रूप में कोई बचत नहीं है, जिसका अर्थ है कि तालिका (एस) स्कीमा को किसी भी तरह से परामर्श करना है। वास्तविक रूप से, स्तंभों को सूचीबद्ध करने में समान लागत आएगी क्योंकि उन्हें स्कीमा के खिलाफ मान्य होना होगा। दूसरे शब्दों में यह एक पूर्ण धो है।
आइटम 4 के लिए, जब आप विशिष्ट कॉलम निर्दिष्ट करते हैं, तो आपकी क्वेरी प्लान कैश बड़ी हो सकती है, लेकिन केवल तभी जब आप कॉलम के विभिन्न सेटों के साथ काम कर रहे हों (जो कि आपके द्वारा निर्दिष्ट नहीं है)। इस मामले में, आप चाहते हैं अलग कैश प्रविष्टियों क्योंकि आप विभिन्न योजनाओं के रूप में की जरूरत है चाहता हूँ।
तो, यह सब नीचे आता है, क्योंकि जिस तरह से आपने प्रश्न को निर्दिष्ट किया था, आखिरकार स्कीमा संशोधनों के सामने समस्या को हल करने के लिए। यदि आप इस स्कीमा को ROM में जला रहे हैं (ऐसा होता है), तो एक *
पूरी तरह से स्वीकार्य है।
हालांकि, मेरी सामान्य दिशानिर्देश यह है कि आपको केवल उन कॉलमों का चयन करना चाहिए जिनकी आपको आवश्यकता है, जिसका अर्थ है कि कभी-कभी ऐसा लगेगा जैसे आप उन सभी से पूछ रहे हैं, लेकिन डीबीए और स्कीमा विकास का मतलब है कि कुछ नए कॉलम दिखाई दे सकते हैं जो क्वेरी को बहुत प्रभावित कर सकते हैं। ।
मेरी सलाह है कि आपको हमेशा विशिष्ट स्तंभों का चयन करना चाहिए । याद रखें कि आप जो भी करते हैं उसमें अच्छा मिलता है, इसलिए इसे सही तरीके से करने की आदत डालें।
यदि आप सोच रहे हैं कि कोड बदलने के बिना एक स्कीमा क्यों बदल सकता है, तो ऑडिट लॉगिंग, प्रभावी / समाप्ति तिथियों और अन्य समान चीजों के बारे में सोचें जो अनुपालन मुद्दों के लिए व्यवस्थित रूप से डीबीए द्वारा जोड़े जाते हैं। अंडरहैंड किए गए परिवर्तनों का एक अन्य स्रोत सिस्टम या उपयोगकर्ता-परिभाषित क्षेत्रों में कहीं और प्रदर्शन के लिए विकृति है।