2012-02-01 11 views
5

मैंने सुना है कि सामान्य रूप से प्रश्न लिखने का यह गलत तरीका है, लेकिन मुझे आश्चर्य है कि कुछ लोग एसक्यूएल के नए उपयोगकर्ताओं को कहते हैं।'select table_name। *' का उपयोग करने के पेशेवर और विपक्ष क्या हैं?

क्या यह वास्तव में खराब रूप है या सिर्फ सादा आलसी है?

इसलिए, इस पर बहुत अधिक राय मांगने के लिए, प्रश्नों में इसका उपयोग करने के कुछ अच्छे कारण क्या हैं, इसके अलावा प्रत्येक फ़ील्ड नाम टाइप करने के अलावा। इसके अलावा, क्या इन कारणों से इसके उपयोग में नुकसान से अधिक है?

+0

यह किसी अन्य की तरह एक उपकरण है। यदि आप इसका कभी भी उपयोग नहीं करते हैं, तो इसके बारे में चिंता न करें। –

+0

यदि आपकी स्कीमा बदलती है और आपका कोड डेटा सेट में कॉलम के क्रम पर निर्भर करता है तो यह आपको बाद में काट सकता है। इसके अलावा कुछ भी * तकनीकी रूप से * इसके साथ गलत नहीं है। –

+0

@Marc B. मैं इसे हर समय उपयोग करता हूं और यही मुझे चिंता कर सकता है। – Matthew

उत्तर

11

जब आपका प्रोग्राम संकलन-समय पर या कॉन्फ़िगरेशन के माध्यम से आपकी तालिका की संरचना के बारे में जानता है, select * का उपयोग करना एक अच्छा विचार नहीं है: आपकी तालिका की संरचना में कोई भी परिवर्तन क्वेरी से वापस आने वाले परिणामों की संरचना को तोड़ सकता है , अंततः रन-टाइम त्रुटियों का कारण बनता है।

हालांकि, ऐसे मामले हैं जब * अनिवार्य है। विशेष रूप से, यदि आपका प्रोग्राम किसी क्वेरी से वापस आने वाले मेटाडेटा को पढ़कर आपकी तालिकाओं की संरचना के गतिशील रूप से "सीखता है", तो "सभी कॉलम" अनुरोध का उपयोग करके आपके प्रोग्राम गतिशील रूप से आपके तालिकाओं में परिवर्तन लेने देता है।

यह बिना कहने के चला जाता है कि * का उपयोग SQL स्टूडियो/एसक्यूएलप्लस/आदि के अपने पसंदीदा स्वाद में विज्ञापन-संबंधी प्रश्नों के लिए किया जाता है। बहुत आम और सुविधाजनक है।

+0

यह एक अच्छा उदाहरण है कि मुझे लगता है कि मैं हाल ही में क्या कर रहा हूं उसके लिए ठीक है। मेरे पास जेनेरिक जावा क्लासेस हैं जो क्वेरी परिणाम लेते हैं और फ़ील्ड के लिए गेटर्स रखते हैं। यदि मैं * का उपयोग करता हूं, तो ये ऑब्जेक्ट्स तालिका में जोड़े गए किसी भी नए फ़ील्ड को उठाते हैं। – Matthew

+0

@ मैथ्यू - लेकिन संभवतः आपको ऐसे कोड लिखने की ज़रूरत है जो इन अतिरिक्त कॉलम का उपभोग करते हैं या आप डेटा का एक भार वापस लाते हैं जो कभी भी उपयोग नहीं किया जाता है?तो कोड को विस्तारित करने के साथ ही आप क्वेरी को उसी समय क्यों नहीं बदलेंगे। –

+0

@ मैथ्यू आप सही हैं, आपका उदाहरण उन परिणामों को प्राप्त करने के लिए 'चयन *' का उपयोग करने के लिए क्लासिक केस है जो अन्यथा बहुत अधिक प्रयास की आवश्यकता होती है। – dasblinkenlight

3

वाइल्डकार्ड * का उपयोग करते समय सिस्टम को उस तालिका के लिए सभी कॉलम नामों को संसाधित करना होगा, और उन्हें वापस कर देना होगा।

इसलिए * का उपयोग करके मैन्युअल रूप से उन्हें मैन्युअल रूप से टाइप करने से प्रदर्शन के लिए बदतर है।

सामान्य नियम यह है कि इसका उपयोग करने से बचने के लिए है, और इसके बजाय आपको आवश्यक कॉलम निर्दिष्ट करें।

+6

डीबी को पहले से ही फील्ड नामों के लिए तालिका को संसाधित करना है, यह सुनिश्चित करने के लिए कि आप उन फ़ील्ड के लिए नहीं पूछ रहे हैं जो मौजूद नहीं हैं। समस्या अतिरिक्त डेटा पुनर्प्राप्ति है - लोडिंग/डिकोडिंग/स्वरूपित फ़ील्ड में कोई बिंदु नहीं जो केवल फेंक दिया जाता है क्योंकि उपयोगकर्ता केवल एक फ़ील्ड चाहता था, न कि तालिका में 50 अन्य। –

+0

@Marc B आपकी टिप्पणी भी इस तथ्य को उधार देती है कि यदि तालिका बदलती है और एक फ़ील्ड हटा दिया जाता है, तो इसके कारण कम कोड समाप्त हो जाता है। – Matthew

+0

@marcB, आपकी टिप्पणी गलत है, जब आप चयन * का उपयोग करते हैं तो प्रदर्शन हिट होता है। – HLGEM

1

select * का उपयोग कर स्तंभों के क्रम पर निर्भर करता है। एक संबंधपरक दृष्टिकोण से कॉलम का क्रम अप्रासंगिक है। निम्नलिखित दो टेबल समान हैं जब उन पर परिचालन करते हैं:

create table alpha (int id, int value); 
create table beta (int value, int id); 

उनके बीच अलग-अलग एकमात्र चीज कॉलम का क्रम है। कॉलम नाम & प्रकार समान हैं। स्तंभों के क्रम को सभी मामलों में एक आंतरिक कार्यान्वयन विस्तार के रूप में माना जाना चाहिए, और इस तरह के लिए कभी प्रोग्राम नहीं किया जाना चाहिए।

कभी-कभी परिस्थितियां होती हैं, जहां आप आदेश के संबंध में सभी कॉलम, w/o चुनना चाहते हैं। (उदाहरण के लिए, डेटा विश्लेषण प्रोग्राम किसी तालिका की संरचना निर्धारित करने के लिए कुछ प्रकार के प्रश्नों को कर सकते हैं - लेकिन फिर, संरचना कॉलम के नाम/डेटा प्रकार हैं, न कि उनके आदेश।

इसका उपयोग न करें ।

1

पुस्तक SQL Antipatterns अध्याय "अंतर्निहित कॉलम"।

सबसे विशिष्ट एक प्रश्न में fieldnames के लिए वाइल्डकार्ड के उपयोग किया जाता है जब एक तदर्थ क्वेरी लिखित रूप में गहराई में इस विषय को शामिल किया गया। यह तेजी से होता है '*' टाइप करने के लिए प्रत्येक फ़ील्ड नाम में टाइप करना है जिसे आप वापस करना चाहते हैं। प्रोग्रामर का समय काफी महंगा है, इसलिए यह समझ में आता है कि विज्ञापन-प्रसार क्वेरी चलाने पर थोड़ा प्रदर्शन लाभ के बारे में चिंता न करें, जहां आप ' नामों में टाइप करने में अधिक समय बर्बाद कर देगा।

हालांकि, आपको अभी भी डेटाबेस स्कीमा का कुछ ज्ञान होना चाहिए, क्योंकि बड़ी संख्या में पंक्तियों पर ब्लॉब कॉलम से मूल्यों की प्रतीक्षा करने से बहुत समय बर्बाद हो सकता है, खासकर अगर आप चाहते थे कि प्राथमिक कुंजी मूल्य ।

SELECT * का उपयोग करके, आपको किसी विशेष क्वेरी पर अच्छा प्रदर्शन हो रहा है क्योंकि यह कुछ सौ बाइट्स का एक छोटा परिणाम सेट लौटा रहा है, हालांकि, कुछ अन्य फ़ंक्शन के लिए तालिका में कुछ ब्लॉब फ़ील्ड जोड़ें, और शायद परिणाम सेट लाखों बाइट्स में है, और अचानक आपकी क्वेरी धीमी है, भले ही आप जिस डेटा का उपयोग करते हैं वह बहुत छोटा है। इस समस्या से बचने के लिए, अपनी क्वेरी में कॉलम का नाम दें।

यदि आप SELECT * का उपयोग कर रहे हैं तो आपके पास जोड़े जाने पर स्वचालित रूप से नए कॉलम के मान होंगे, फिर भी आप उपर्युक्त परिदृश्य से पीड़ित होंगे। यह एक व्यापार बंद है, जिसे आपको चुनना होगा।

जब तक आपके पास कोई कारण नहीं है, तो SELECT * का उपयोग करना वैध है, अपवाद के साथ कि आलस्य वैध कारण नहीं है।

+0

चिंता न करें, मैं कभी भी सभी मामलों में इसका उपयोग करने का सुझाव नहीं दूंगा। हालांकि मैं हाल ही में इसका बहुत उपयोग कर रहा हूं। मेरा मानना ​​है कि मैंने काफी प्रगति की है और जब मैं सिर्फ एक टेबल से "कुछ डेटा प्राप्त करने की आवश्यकता" करता हूं तो मैं इसका उपयोग नहीं कर रहा हूं। – Matthew

संबंधित मुद्दे