sql - एएनएसआई-8 9 पर एसक्यूएल एएनएसआई-9 2 मानक बेहतर ढंग से क्यों नहीं अपनाया गया है?




join ansi-sql (11)

मैंने जिस कंपनी में काम किया है, मैंने पाया है कि लोग अभी भी एएनएसआई -88 मानक में अपने एसक्यूएल प्रश्न लिख रहे हैं:

select a.id, b.id, b.address_1
from person a, address b
where a.id = b.id

एएनएसआई-9 2 मानक के बजाए:

select a.id, b.id, b.address_1
from person a
inner join address b
on a.id = b.id

इस तरह की एक बेहद सरल क्वेरी के लिए, पठनीयता में कोई बड़ा अंतर नहीं है, लेकिन बड़ी पूछताछ के लिए मुझे लगता है कि तालिका में सूचीबद्ध होने के साथ समूह में शामिल होने वाले मेरे शामिल मानदंडों को देखना मेरे लिए बहुत आसान है, जहां मुझे अपने शामिल होने में समस्याएं हो सकती हैं, और चलो मैं अपने सभी फ़िल्टरिंग को अपने WHERE खंड में रखता हूं। उल्लेख नहीं है कि मुझे लगता है कि बाहरी जुड़ने ओरेकल में (+) वाक्यविन्यास से अधिक सहज हैं।

चूंकि मैं लोगों को एएनएसआई-9 2 का प्रचार करने की कोशिश करता हूं, क्या एएनएसआई-9 8 पर एएनएसआई-9 2 का उपयोग करने में कोई ठोस प्रदर्शन लाभ है? मैं इसे अपने आप पर आज़माउंगा, लेकिन हमारे यहां ओरेकल सेटअप हमारे पास एक्स्पलाइन प्लान का उपयोग करने की अनुमति नहीं देते हैं - नहीं चाहते हैं कि लोग अपने कोड को अनुकूलित करने का प्रयास करें, क्या होगा?


1) बाहरी जॉइन लिखने का मानक तरीका, बनाम * = या (+) =

2) प्राकृतिक जॉइन

3) डेटाबेस इंजन में निर्भर करता है, एएनएसआई-9 2 रुझान अधिक इष्टतम होने के लिए।

4) मैन्युअल अनुकूलन:

मान लें कि हमारे पास अगला वाक्यविन्यास है (एएनएसआई -8 9):

(1)select * from TABLE_OFFICES to,BIG_TABLE_USERS btu
where to.iduser=tbu.iduser and to.idoffice=1

इसे इस प्रकार लिखा जा सकता है:

(2)select * from TABLE_OFFICES to
inner join BIG_TABLE_USERS btu on to.iduser=tbu.iduser
where to.idoffice=1

लेकिन इसके रूप में भी:

(3)select * from TABLE_OFFICES to
inner join BIG_TABLE_USERS btu on to.iduser=tbu.iduser and to.idoffice=1

उनमें से सभी (1), (2), (3) एक ही परिणाम लौटाते हैं, हालांकि उन्हें अलग-अलग अनुकूलित किया जाता है, यह डेटाबेस इंजन में निर्भर करता है लेकिन उनमें से अधिकांश करते हैं:

  • (1) डेटाबेस इंजन तक यह अनुकूलन का निर्णय लेता है।
  • (2) यह दोनों टेबलों में शामिल होता है फिर प्रति कार्यालय फ़िल्टर करें।
  • (3) यह idoffice का उपयोग कर BIG_TABLE_USERS फ़िल्टर करता है और फिर दोनों तालिकाओं में शामिल होता है।

5) लंबे प्रश्न कम गन्दा हैं।


SQL-89, और SQL-92 की तुलना में कुछ बिंदु यहां दिए गए हैं और अन्य उत्तरों में कुछ गलत धारणाओं को साफ़ कर रहे हैं।

  1. NATURAL JOINS एक भयानक विचार है। वे निहित हैं और उन्हें तालिका के बारे में मेटा-सूचना की आवश्यकता है। एसक्यूएल-9 2 के बारे में कुछ भी उनके उपयोग की आवश्यकता नहीं है, इसलिए उन्हें आसानी से अनदेखा करें । वे इस चर्चा के लिए प्रासंगिक नहीं हैं।
  2. USING करना एक अच्छा विचार है, इसका दो प्रभाव हैं:
    1. यह इक्विजॉइन से परिणाम सेट पर केवल एक कॉलम उत्पन्न करता है।
    2. यह एक ध्वनि और सायन सम्मेलन लागू करता है। एसक्यूएल -88 में आप दोनों टेबल पर कॉलम id लिख रहे थे। टेबल में शामिल होने के बाद, यह बन जाता है और अस्पष्ट होता है और इसे स्पष्ट अलियासिंग की आवश्यकता होती है। इसके अलावा, शामिल होने पर id पास निश्चित रूप से अलग-अलग डेटा थे। यदि आप कंपनी में व्यक्ति से जुड़ते हैं, तो अब आपको एक id को person_id पर उपनाम करना होगा, और एक id company_id , जिसके बिना जॉइन दो अस्पष्ट कॉलम उत्पन्न करेगा। तालिका की सरोगेट कुंजी के लिए वैश्विक रूप से अद्वितीय पहचानकर्ता का उपयोग करना सम्मेलन का USING मानक के साथ मानक पुरस्कार है।
  3. एसक्यूएल -8 9 सिंटैक्स एक अंतर्निहित CROSS JOIN । एक CROSS JOIN सेट को कम नहीं करता है, यह स्पष्ट रूप से इसे बढ़ाता है। FROM T1,T2 FROM T1 CROSS JOIN T2 , जो कार्टेशियन जॉइन का उत्पादन करता है जो आम तौर पर आप नहीं चाहते हैं। उस दूर को दूर करने के लिए चुनिंदाता होने के कारण WHERE सशर्त अर्थ है कि आप डिज़ाइन के दौरान गलतियां करने की अधिक संभावना रखते हैं।
  4. एसक्यूएल -8 9 , और एसक्यूएल JOIN 2 स्पष्ट JOIN अलग-अलग प्राथमिकताएं हैं। JOIN की एक उच्च प्राथमिकता है। इससे भी बदतर, MySQL जैसे कुछ डेटाबेसों को यह बहुत लंबा समय लगता है। । इसलिए दो शैलियों को मिलाकर एक बुरा विचार है, और आज तक की सबसे लोकप्रिय शैली एसक्यूएल-9 2 शैली है।

ओरेकल एएनएसआई-9 2 को अच्छी तरह से लागू नहीं करता है। मुझे कई समस्याएं आई हैं, कम से कम नहीं क्योंकि ओरेकल ऐप्स में डेटा टेबल कॉलम के साथ बहुत अच्छी तरह से संपन्न हैं। यदि आपके जुड़ने में कॉलम की संख्या लगभग 1050 कॉलम से अधिक है (जो ऐप्स में करना बहुत आसान है), तो आपको यह नकली त्रुटि मिल जाएगी जो बिल्कुल तार्किक समझ नहीं देती है:

ORA-01445: cannot select ROWID from a join view without a key-preserved table.

पुराने स्टाइल में सिंटैक्स में शामिल होने के लिए क्वेरी को दोबारा लिखना समस्या को गायब कर देता है, जो एएनएसआई-9 2 जुड़ने के कार्यान्वयन पर पूरी तरह से दोष की उंगली को इंगित करता है।

जब तक मुझे इस समस्या का सामना नहीं हुआ, मैं एएसएनआई-9 2 का एक स्थिर प्रमोटर था, क्योंकि आकस्मिक क्रॉस जॉइन के मौके को कम करने में लाभों के कारण, जो पुराने शैली के सिंटैक्स के साथ बहुत आसान है।

अब, हालांकि, मुझे इस पर जोर देना मुश्किल लगता है। वे ओरेकल के खराब कार्यान्वयन को इंगित करते हैं और कहते हैं, "हम इसे अपना रास्ता करेंगे, धन्यवाद।"


कुछ कारण दिमाग में आते हैं:

  • लोग आदत से बाहर करते हैं
  • लोग आलसी हैं और "पुरानी शैली" में शामिल होना पसंद करते हैं क्योंकि उनमें कम टाइपिंग शामिल है
  • शुरुआती लोगों को एसक्यूएल-9 2 सिंटैक्स में शामिल होने के दौरान अक्सर अपने सिर लपेटने में समस्याएं होती हैं
  • लोग सिर्फ नए सिंटैक्स पर स्विच नहीं करते हैं क्योंकि यह वहां है
  • लोगों को नए लाभों से अनजान हैं (यदि आप इसे कॉल करना चाहते हैं) सिंटैक्स है, मुख्य रूप से यह है कि यह आपको बाहरी शामिल होने से पहले एक टेबल फ़िल्टर करने में सक्षम बनाता है, और इसके बाद आपके पास जब भी है, वहां WHERE क्लॉज नहीं है।

मेरे भाग के लिए, मैं SQL-92 सिंटैक्स में अपने सभी जुड़ता हूं, और मैं कोड को कन्वर्ट करता हूं जहां मैं कर सकता हूं। यह करने के लिए यह क्लीनर, अधिक पठनीय और शक्तिशाली तरीका है। लेकिन किसी को नई शैली का उपयोग करने के लिए मनाने के लिए मुश्किल है, जब उन्हें लगता है कि क्वेरी परिणाम बदलने के दौरान उन्हें अधिक टाइपिंग कार्य के मामले में दर्द होता है।


जड़ता और व्यावहारिकता।

एएनएसआई-9 2 एसक्यूएल टच-टाइपिंग की तरह है। कुछ सैद्धांतिक तरीके से यह किसी भी चीज़ को किसी दिन बेहतर बना सकता है, लेकिन मैं अब चार अंगुलियों वाली चाबियों को देखकर बहुत तेज टाइप कर सकता हूं। मुझे आगे जाने के लिए पीछे की तरफ जाना होगा, इस बात की कोई गारंटी नहीं है कि कभी भी पे-ऑफ होगा।

एसक्यूएल लेखन मेरे काम का लगभग 10% है। अगर मुझे किसी समस्या को हल करने के लिए ANSI-92 SQL की आवश्यकता है जो ANSI-89 SQL हल नहीं कर सकता है तो मैं इसका उपयोग करूंगा। (मैं इसे वास्तव में एक्सेस में उपयोग करता हूं।) अगर इसका इस्तेमाल हर समय मेरी मौजूदा समस्याओं को हल करने में मदद करेगा, तो मैं इसे पूरा करने के लिए समय व्यतीत करूंगा। लेकिन मैं कभी भी वाक्यविन्यास के बारे में सोचने के बिना एएनएसआई -8 9 एसक्यूएल को चाबुक कर सकता हूं। मुझे समस्याओं को हल करने के लिए भुगतान मिलता है - एसक्यूएल सिंटैक्स के बारे में सोचना मेरे समय और मेरे नियोक्ता के पैसे का अपशिष्ट है।

किसी दिन, युवा घास का मैदान, आप युवा लोगों के खिलाफ एएनएसआई-9 2 एसक्यूएल सिंटैक्स के उपयोग का बचाव करेंगे, जिसमें आपको लगता है कि आपको SQL3 (या जो कुछ भी) का उपयोग करना चाहिए। और फिर आप समझेंगे। :-)


पीटर गुलट्ज़न और ट्रूडी पेलज़र द्वारा "एसक्यूएल परफॉर्मेंस ट्यूनिंग" के अनुसार, उन्होंने छः या आठ आरडीबीएमएस ब्रांडों का परीक्षण किया, एसक्यूएल -8 9 बनाम एसक्यूएल -8 9 शैली के अनुकूलन या प्रदर्शन में कोई अंतर नहीं था। कोई यह मान सकता है कि अधिकांश आरडीबीएमएस इंजन क्वेरी को अनुकूलित या निष्पादित करने से पहले वाक्यविन्यास को आंतरिक प्रतिनिधित्व में बदल देते हैं, इसलिए मानव-पठनीय वाक्यविन्यास में कोई फर्क नहीं पड़ता।

मैं SQL-92 वाक्यविन्यास को प्रचारित करने का भी प्रयास करता हूं। अनुमोदित होने के सोलह साल बाद, यह समय लोगों ने इसका उपयोग करना शुरू कर दिया! और एसक्यूएल डेटाबेस के सभी ब्रांड अब इसका समर्थन करते हैं, इसलिए घृणास्पद (+) ओरेकल सिंटैक्स या *= माइक्रोसॉफ्ट / साइबेस सिंटैक्स का उपयोग जारी रखने का कोई कारण नहीं है।

एसक्यूएल -88 आदत के डेवलपर समुदाय को तोड़ना इतना कठिन क्यों है, मैं केवल यह मान सकता हूं कि प्रोग्रामर्स के बड़े "पिरामिड का आधार" है जो कॉपी और पेस्ट द्वारा कोड, किताबों, पत्रिका लेखों के प्राचीन उदाहरणों का उपयोग करके, या एक और कोड आधार, और ये लोग अमूर्त रूप से नए वाक्यविन्यास नहीं सीखते हैं। कुछ लोग पैटर्न-मैच, और कुछ लोग रोटे से सीखते हैं।

मैं धीरे-धीरे लोगों को एसक्यूएल-9 2 सिंटैक्स का उपयोग करके अधिक बार देख रहा हूं, जैसा कि मैंने उपयोग किया था। मैं 1 99 4 से ऑनलाइन SQL प्रश्नों का उत्तर दे रहा हूं।


प्राकृतिक जॉइन और ऊपर पोस्ट का उपयोग करने के जवाब में।

आप इन्हें कभी भी उपयोग करने की आवश्यकता क्यों देखेंगे - वे एएनएसआई -88 में उपलब्ध नहीं थे और एएनएसआई-9 2 के लिए जोड़े गए थे जिन्हें मैं केवल शॉर्टकट के रूप में देख सकता हूं।

मैं मौके पर कभी भी शामिल नहीं रहूंगा और हमेशा टेबल / उपनाम और आईडी निर्दिष्ट करता हूं।

मेरे लिए, एएनएसआई-9 2 जाने का एकमात्र तरीका है। यह अधिक verbose है और वाक्यविन्यास एएनएसआई -88 अनुयायियों द्वारा पसंद नहीं है, लेकिन यह आपके जॉइन को आपके फ़िल्टर से अलग करता है।


मुझे निश्चित रूप से उत्तर नहीं पता .. यह एक धार्मिक युद्ध है (मैक-पीसी या अन्य की तुलना में कम डिग्री का अल्बियेट)

एक अनुमान यह है कि काफी हाल ही में, ओरेकल, (और शायद अन्य विक्रेताओं) ने एएनएसआई-9 2 मानक (मुझे लगता है कि यह ओरेकल वी 9 में था, या वहां) और इसलिए, डीबीए / डीबी डेवलपर्स कंपनियों के लिए काम कर रहे थे, अभी भी इन संस्करणों का उपयोग कर रहे थे, (या चाहते थे कि कोड उन सर्वरों पर पोर्टेबल हो जो इन संस्करणों का उपयोग कर रहे हों, उन्हें पुराने मानक से चिपकना पड़ा ...

यह वास्तव में शर्म की बात है, क्योंकि नया शामिल वाक्यविन्यास बहुत अधिक पठनीय है, और पुराना वाक्यविन्यास कई अच्छी तरह से प्रलेखित परिदृश्यों में गलत (गलत) परिणाम उत्पन्न करता है।

  • विशेष रूप से, जब सशर्त फ़िल्टरिंग होती है तो बाहरी जुड़ता है जब शामिल होने के "बाहरी" पक्ष पर तालिका से गैर-जुड़ने वाले कॉलम पर गैर-जुड़ें।

मेरे पास एक क्वेरी थी जिसे मूल रूप से SQL Server 6.5 के लिए लिखा गया था, जो SQL 92 शामिल वाक्यविन्यास का समर्थन नहीं करता था, यानी

select foo.baz
from foo
  left outer join bar
  on foo.a = bar.a

इसके बजाय लिखा गया था

select foo.baz
from foo, bar
where foo.a *= bar.a

क्वेरी थोड़ी देर के लिए आसपास रही थी, और प्रासंगिक डेटा को धीमा चलाने के लिए संचित किया गया था, पूरा करने के लिए 90 सेकंड के करीब। जब तक यह समस्या उत्पन्न हुई, तब तक हमने SQL सर्वर 7 में अपग्रेड किया था।

इंडेक्स और अन्य ईस्टर-अंडे के साथ मिलकर काम करने के बाद, मैंने एसक्यूएल 92 अनुपालन के लिए सिंटैक्स में शामिल किया। क्वेरी समय 3 सेकंड तक गिर गया।

स्विच करने का एक अच्छा कारण है।

here से दोबारा पोस्ट किया here


मैं एक औसत डेवलपर के दृष्टिकोण से उत्तर दे सकता हूं, सिंटैक्स दोनों को समझने के लिए पर्याप्त एसक्यूएल को जानना, लेकिन फिर भी मुझे हर बार डालने के सटीक वाक्यविन्यास को गुगल करना ... :-P (मैं पूरे दिन एसक्यूएल नहीं करता , समय-समय पर कुछ समस्याओं को ठीक करना।)

खैर, असल में, मुझे पहला फॉर्म अधिक सहज ज्ञान मिलता है, जिससे दो तालिकाओं के बीच कोई स्पष्ट पदानुक्रम नहीं होता है। तथ्य यह है कि मैंने संभवतः पुरानी किताबों के साथ एसक्यूएल सीखा, पहला फॉर्म दिखा रहा है, शायद मदद नहीं करता ... ;-)
और Google में एक एसक्यूएल चुनिंदा खोज पर मुझे पहला संदर्भ मिलता है (जो मेरे लिए ज्यादातर फ्रांसीसी उत्तर देता है ...) पहले पुराने फॉर्म को दिखाता है (फिर दूसरे को समझाएं)।

बस "क्यों" प्रश्न पर कुछ संकेत दे रहे हैं ... ^ _ ^ मुझे इस विषय पर एक अच्छी, आधुनिक पुस्तक (डीबी अज्ञेयवादी) पढ़नी चाहिए। अगर किसी के पास सुझाव हैं ...


सबसे पहले मुझे कहना है कि SQL सर्वर में बाहरी सिंटैक्स (* =) में शामिल होने से हर समय सही परिणाम नहीं मिलते हैं। ऐसे समय होते हैं जब यह व्याख्या करता है कि एक क्रॉस के रूप में शामिल होता है और बाहरी शामिल नहीं होता है। तो इसका उपयोग बंद करने का एक अच्छा कारण है। और वह बाहरी शामिल वाक्यविन्यास एक बहिष्कृत सुविधा है और SQL सर्वर 2008 के बाद SQL सर्वर के अगले संस्करण में नहीं होगा। आप अभी भी आंतरिक जुड़ने में सक्षम होंगे लेकिन पृथ्वी पर क्यों कोई भी चाहेंगे? वे अस्पष्ट हैं और बनाए रखने के लिए बहुत कठिन हैं। आप आसानी से नहीं जानते कि इसमें शामिल होने का हिस्सा क्या है और वास्तव में केवल खंड कहां है।

एक कारण है कि मेरा मानना ​​है कि आपको पुराने वाक्यविन्यास का उपयोग नहीं करना चाहिए, यह समझना है कि समझ में शामिल होना और वे क्या करते हैं और ऐसा नहीं करते हैं जो SQL कोड लिखने वाले किसी के लिए एक महत्वपूर्ण कदम है। समझने के बिना आपको कोई भी SQL कोड नहीं लिखना चाहिए। यदि आप उन्हें अच्छी तरह से समझते हैं, तो आप शायद इस निष्कर्ष पर आ जाएंगे कि एएनएसआई-9 2 वाक्यविन्यास स्पष्ट और बनाए रखने में आसान है। मैंने कभी एक एसक्यूएल विशेषज्ञ से मुलाकात नहीं की है जिसने पुरानी वाक्यविन्यास को वरीयता में एएनएसआई-9 2 वाक्यविन्यास का उपयोग नहीं किया है।

अधिकांश लोग जिन्हें मैंने पुराने कोड का उपयोग करने वाले लोगों से मुलाकात की है या निपटाया है, वास्तव में डेटाबेस को पूछते समय वास्तव में शामिल नहीं होते हैं और इस प्रकार समस्या में आते हैं। यह मेरा व्यक्तिगत अनुभव है इसलिए मैं यह नहीं कह रहा कि यह हमेशा सत्य है। लेकिन एक डेटा विशेषज्ञ के रूप में, मुझे इस बात पर विश्वास करने के लिए वर्षों के दौरान इस जंक का बहुत अधिक ठीक करना पड़ा है।





ansi-92