एसक्यूएल प्रश्नों को कोडित करना


17

क्या मुझे अलग-अलग लाइनों में SQL प्रश्नों को तोड़ना चाहिए? उदाहरण के लिए, जिस परियोजना पर मैं काम कर रहा हूं, उसमें हमारे पास एक क्वेरी है जो 1600 कॉलम ले रही है! 1600 + टैब वर्ण। मैंने इस तरह के प्रश्न लिखे:

   "SELECT bla , bla2 , bla FROM bla " . 
     "WHERE bla=333 AND bla=2" . 
      "ORDER BY nfdfsd ...";

लेकिन उन्होंने मुझे उन्हें एक पंक्ति में रखने की मांग की और कहा कि मेरी शैली खराब प्रारूपण की है। यह बुरा अभ्यास क्यों है?


आपत्ति प्रक्षेपित उद्धरणों (दोहरे उद्धरणों) और संघनन ( .) के उपयोग के लिए हो सकती है , जिसे मैंने कुछ प्रोग्रामर को प्रदर्शन लागत के लिए दोषी माना है।
ब्रूस एल्डर्सन

3
सब कुछ 1 लाइन पर होना आवश्यक है? हेलो स्क्रॉल बार, गुड बाय पठनीयता।
mike30

1
@BruceAlderson उन शुरुआती 2000 के दशक की तरह लगता है "गृहिणी अपने PHP लेखों को अनुकूलित करने के लिए 3 सरल युक्तियां बताती हैं।" डबल कोट्स और / या कॉनसैनेटेशन के साथ असली लाल झंडा तब आता है जब आप SQL इंजेक्शन के हमलों को बनाने से उन्हें ठीक से भागने के बिना चर डालना शुरू करते हैं।
सीन मैकोसमेलिंग

1
क्या कोई "घर में" उपकरण फ़ाइलों को संसाधित करने के लिए उपयोग किया जाता है?
इयान

यह समझना इतना कठिन क्यों है कि जब तक आपको कोड का भुगतान किया जा रहा है, तब तक आप लिखना, स्वच्छ, स्वच्छ, क्रमबद्ध कोड लिखना चाहते हैं?
ट्यूलेंस कोरडोवा

जवाबों:


33

स्रोत नियंत्रण कारणों के लिए, हमारे पास हर उस खंड के बाद लाइनब्रीक है, जहां या कॉमा है। तो आपका ऊपर में बदल जाता है

SELECT bla 
     , bla2 
     , bla 
FROM   bla 
WHERE  bla=333 
  AND  bla=2
ORDER  BY nfdfsd
        , asdlfk;

(टैबिंग और अलाइनमेंट का यहां कोई मानक नहीं है, लेकिन कॉमा आमतौर पर अग्रणी होते हैं)

फिर भी, कोई प्रदर्शन अंतर नहीं बनाता है।


5
अच्छा विचार है, यह एक छोटे से बदलाव को एक स्रोत नियंत्रण अंतर में बहुत अच्छी तरह से बाहर खड़ा करेगा।
कार्सन 63000

मेरे द्वारा उपयोग किए जाने के समान ही बहुत अधिक प्रारूपण, हालांकि मैं आमतौर पर सभी चयनित सूची को एक ही पंक्ति (या कई पंक्तियों में अगर वहाँ बहुत सारे कॉलम हैं) पर रखता है
डीन हार्डिंग

7
यहां समान लेआउट, केवल प्रमुख अल्पविराम होने का अंतर है, हमारे पास इसका अंत है।
DBlackborough

4
@ m.edmondson - स्रोत नियंत्रण में संस्करण के बीच डिफ-इंग लाइन के आधार पर एक पंक्ति में परिवर्तन पर प्रकाश डालता है। इस प्रारूप के साथ प्रत्येक पंक्ति में एक ही जानकारी होती है - एक कॉलम नाम, एक टेबल का नाम, एक ज्वाइन या ऑर्डर क्लॉज - जिसका अर्थ है कि यह अंतर उस बिंदु पर सही इंगित करेगा जो परिवर्तित है, न कि केवल कई चीजों के साथ एक लाइन पर और आपको छोड़ने के लिए। क्या अलग है यह जानने के लिए।
जॉन हॉपकिंस

2
यह प्रारूप विकास के दौरान एकल वस्तुओं पर टिप्पणी करना और क्रम बदलने के लिए कट और पेस्ट का उपयोग करना आसान बनाता है।
क्रिस नवा

14

1600 स्तंभों वाली एक क्वेरी ऐसा लगता है जैसे एक अच्छे डीबीए द्वारा कुछ गंभीर समीक्षा की आवश्यकता है।

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

यह सभी प्रबंधनीयता के बारे में है और समझ में नहीं आता है कि ऐसा करने के लिए क्या करना है या नहीं लपेटना तय किया जा सकता है, जब तक कि आपके संगठन के पास इसके बारे में कुछ कोड स्वरूपण नियम न हों।

पुन: यह बुरा कोडिंग अभ्यास किया जा रहा है। मुश्किल से! यह बहुत अच्छा अभ्यास है। मेरे द्वारा लंबे समय तक क्वेरी का उपयोग करने के बारे में कोई अच्छे कारण नहीं हैं, और इसे सुधारने के लिए कई अच्छे कारण हैं। जैसा कि मैंने पहले कहा, एक कुशल डीबीए को शायद इस पर काम करने की आवश्यकता है।


3
सहमत, यह वास्तव में पठनीयता के लिए नीचे आता है। प्रदर्शन आदि इस सब से प्रभावित नहीं है, यह सब सिर्फ सौंदर्य है।
ईसाई

सहमत हूं कि प्रदर्शन अच्छा तर्क नहीं हो सकता।
टिन मैन

मुझे नहीं पता .. बस मुझे एक लाइन में रखने के लिए कहा था, शायद इसलिए कि वे करते हैं
गोरिल्लाएप

वे शायद इसे छूने से डरते हैं अगर यह "विरासत" कोड है। बस धीरे-धीरे पीछे हट जाओ और सब ठीक हो जाएगा।
टिन मैन

इसका ताज़ा कोड ...
गोरिल्लाएप

8

सिंगल लाइन क्वेश्चन का एकमात्र फायदा जो दिमाग में आता है, वह यह है कि उन सवालों के लिए कुछ आसान हो सकता है। हालांकि, इसके अलावा, मैं स्तब्ध हूं। व्यक्तिगत रूप से, मैं अधिक पठनीय पसंद करता हूं, प्रश्नों को विभाजित करता हूं।


6

SQL के बड़े संस्करणों के साथ काम करते समय बहुस्तरीय टिप्पणियां अच्छी हैं। और अगर आपकी प्रोग्रामिंग भाषा में हेरेडोक उद्धरण हैं, तो यह और भी बेहतर है (क्योंकि कई संपादक उन में SQL सिंटैक्स हाइलाइट कर सकते हैं)।

उदाहरण:

$a = SQL<<<
    SELECT a, b, c, d
    FROM Foo f
    WHERE f.a = ?
SQL;

दर्जनों पंक्तियों (या सैकड़ों) के प्रश्नों के साथ काम करने पर, इंडेंटेशन और व्हाट्सएप दोनों पाठ को काम करने योग्य बनाते हैं।


1
PHP के लिए, Nowdocs एकल-उद्धृत विविधता (अर्थात कोई चर प्रतिस्थापन) नहीं है।
एलन पीयर्स

4

ऐसा लगता है कि यह विशेष रूप से प्रोग्रामिंग भाषा के अंदर एक बड़ी क्वेरी को परिभाषित करने के बारे में है, यह देखते हुए कि आप एक स्ट्रिंग शाब्दिक के अंदर क्वेरी डालते हैं और इसे संक्षिप्त करते हैं।

यदि यह एक संकलित भाषा है, तो इससे कोई फर्क नहीं पड़ना चाहिए - कंपाइलर जो पहली ऑप्टिमाइज़ेशन करेगा, उसमें से एक स्ट्रिंग स्ट्रिंग को एक साथ जोड़ना है, इसलिए आप एक बड़े स्ट्रिंग के साथ समाप्त होते हैं।

सिंटैक्स के लिए, आपको वास्तव में अपने कोड के बाहर क्वेरी को स्थानांतरित करने पर विचार करना चाहिए - इसे एक अलग .sql संसाधन फ़ाइल में संग्रहीत करें, और अपने सॉफ़्टवेयर को उस फ़ाइल को पढ़ें। चरों के लिए तैयार कथनों का उपयोग करें, यदि यह एक ऐसी क्वेरी नहीं है जिसे गतिशील रूप से बनाया गया है (यानी जहां कुछ मानकों के आधार पर क्लॉज़ आदि जोड़े गए हैं)। यदि यह गतिशील रूप से बनाया गया है, तो आप अपने स्वयं के प्रतिस्थापन चर में जोड़ सकते हैं, जहां और जब आवश्यक हो, अतिरिक्त पैरामीटर डाल सकते हैं।

1600 स्तंभों के लिए, मैं गंभीरता से इसके लिए एक दृश्य बनाने की सलाह देता हूं, इसलिए इसके बजाय

SELECT column1, column2, .... column1600 from X where Y

आपको मिल जाएगा

चयन करें * दृश्य x जहां से

अपने स्वयं के कोड में बहुत अधिक संक्षिप्त।


+1, और मैं क्वेरी को एक संग्रहीत प्रक्रिया में बनाने पर भी विचार करूंगा
लैरी कोलमैन

1

मैं अक्सर जटिल क्वेरी का निवारण करने के लिए @glasnt द्वारा डाले गए प्रारूप का उपयोग करता हूं, हालांकि आमतौर पर एकल पंक्ति में प्रश्न होते हैं।

यह आपके प्रश्न का उत्तर नहीं दे सकता है, लेकिन मैं दृढ़ता से आपकी क्वेरी को छोटे प्रश्नों में तोड़ने का सुझाव दूंगा। स्पष्ट रूप से यह क्वेरी पर निर्भर करता है, लेकिन आप अपनी क्वेरी में जितना अधिक क्लॉज़ और जॉइन करते हैं - उतना कम SQL इंजन आपकी क्वेरी को ऑप्टिमाइज़ करने में सक्षम होता है।

आपके डेटाबेस विक्रेता के पास MySQL के EXPLAIN (या MSSQL के SHOWPLAN_ALL सेटिंग) जैसे उपकरण होने चाहिए, जो आपको दिखाएंगे कि डेटाबेस आपकी क्वेरी को अनुकूलित करने के लिए पर्दे के पीछे क्या कर रहा है, हर बार जब डेटाबेस को एक अस्थायी तालिका या कुछ ऐसा बनाना होता है, तो आप जोड़ रहे हैं जब आप कई समवर्ती उपयोगकर्ताओं के बारे में बात कर रहे हैं तो बड़ी देरी।

एसक्यूएल से बाहर तुच्छ तर्क की तरह लग सकता है और अपने कोड में, आप नाटकीय प्रदर्शन में वृद्धि प्रदान कर सकते हैं - सरल ऑपरेशन के लिए एसक्यूएल महान है।

इससे स्पष्ट लाभ, क्योंकि यह आपसे संबंधित हो सकता है, यह है कि आपके प्रश्न बहुत कम जटिल और पढ़ने में आसान हैं - प्रबंधन करने में आसान (1600 कॉलम नहीं), और तेज़। निश्चित रूप से एक चौतरफा जीत।

उम्मीद है की यह मदद करेगा :)

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