2015-11-11 8 views
6

जहां मैं काम कर रहा हूं मुझे हाल ही में बताया गया है कि आपके प्रश्नों में विशिष्ट उपयोग प्रोग्रामर का एक बुरा संकेत है। तो मुझे आश्चर्य है कि मुझे लगता है कि इस फ़ंक्शन का उपयोग न करने का एकमात्र तरीका समूह द्वारा उपयोग करना है।क्या मुझे अपने प्रश्नों में अलग-अलग उपयोग करना चाहिए

यह मेरी समझ थी कि अलग-अलग फ़ंक्शन एक समूह के समान ही काम करता है, इसके अलावा इसे पढ़ा जाता है। एक विशिष्ट फ़ंक्शन प्रत्येक व्यक्तिगत चयन मानदंड को एक समूह बना देता है जिसके द्वारा एक ही चीज़ पूरी तरह से की जाती है।

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

select distinct 
    spriden_user_id as "ID", 
    spriden_last_name as "last", 
    spriden_first_name as "first", 
    spriden_mi_name as "MI", 
    spraddr_street_line1 as "Street", 
    spraddr_street_line2 as "Street2", 
    spraddr_city as "city", 
    spraddr_stat_code as "State", 
    spraddr_zip as "zip" 
from spriden, spraddr 
where spriden_user_id = spraddr_id 
and spraddr_mail_type = 'MA' 

में विशिष्ट का उपयोग करना चाहिए वी.एस.

select 
    spriden_user_id as "ID", 
    spriden_last_name as "last", 
    spriden_first_name as "first", 
    spriden_mi_name as "MI", 
    spraddr_street_line1 as "Street", 
    spraddr_street_line2 as "Street2", 
    spraddr_city as "city", 
    spraddr_stat_code as "State", 
    spraddr_zip as "zip" 
from spriden, spraddr 
where spriden_user_id = spraddr_id 
and spraddr_mail_type = 'MA' 
group by "ID","last","first","MI","Street","Street2","city","State","zip"  
+8

दोनों काफी समकक्ष हैं। यदि आप अपने एसक्यूएल कौशल में सुधार कर रहे हैं, तो स्पष्ट 'जॉइन' क्लॉज का उपयोग करना सीखें। 'से' खंड में कभी भी अल्पविराम का उपयोग न करें। –

+3

जब आप अलग-अलग जानकारी प्राप्त करना चाहते हैं तो अपनी क्वेरी में 'DISTINCT' का उपयोग करना सामान्य ज्ञान का उपयोग करके प्रोग्रामर का एक अच्छा संकेत है। सामान्य ज्ञान के बारे में मजाकिया बात यह है कि यह आम नहीं है। – zedfoxus

+1

जैसा कि कुछ उत्तरों में बताया गया है, 'DISTINCT' (और कभी-कभी विस्तृत' ग्रुप बाय ') अक्सर उपयोग किया जाता है जब किसी ने डेटामैडल को पूरी तरह से समझ नहीं लिया है, और डुप्लीकेट से बचने की इच्छा रखता है - जो आमतौर पर बेहतर तरीके से दूसरे फैशन में निपटाया जाता है (अधिक प्रतिबंधक जुड़ता है, पूर्व-समेकन, या जो भी हो)। आम तौर पर, यदि आप जो कुछ भी करने की कोशिश कर रहे हैं वह आपकी इंडेक्स कुंजी (> 3-5 कॉलम) से बड़ा है, या कॉलम इंडेक्स पर नहीं हैं, तो अक्सर बेहतर तरीका होता है। –

उत्तर

11

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

this question पर एक नज़र डालें। कुछ अच्छे उत्तर हैं जो मदद कर सकते हैं।

+0

इससे मुझे विषय पर कुछ अतिरिक्त जानकारी मिलती है। काश मैं पहले पाया था। धन्यवाद! –

3

आपके उदाहरण में distinct और group by वही काम करें। मुझे लगता है कि आपके सहयोगियों का मतलब है कि आपकी क्वेरी को पहले उदाहरण में डुप्लिकेट वापस नहीं करना चाहिए और आपको distinct या group by खंड के बिना अपनी क्वेरी लिखने में सक्षम होना चाहिए। आप शायद join स्थितियों को बढ़ाकर डुप्लिकेट को कम करने में सक्षम हो सकते हैं।

4

उनसे पूछें कि यह एक बुरा अभ्यास क्यों है। बहुत से लोग नियम बनाते हैं या उन चीजों के साथ आते हैं जिन्हें वे किताब के पहले पृष्ठ को पढ़ने या Google खोज के पहले परिणाम पढ़ने से बुरी आदत मानते हैं। यदि यह नौकरी करता है और किसी भी मुद्दे का कारण नहीं बनता है तो विकल्पों को ढूंढकर और अधिक काम करने का कोई कारण नहीं है। आपके द्वारा पोस्ट किए गए दो विकल्पों में से मैं अलग-अलग उपयोग भी करूँगा क्योंकि इसे पढ़ने और बनाए रखने के लिए यह छोटा और आसान है।

+0

हाहा अगर मैं केवल –

+0

के रूप में उस राय को सुन सकता हूं तो मुझे लगता है कि यह बुरा होता था लेकिन नए ऑरैक ऑप्टिमाइज़र के साथ यह समझने के लिए पर्याप्त स्मार्ट है कि आप क्या चाहते हैं। –

+0

': thums_up' लेकिन सुधार करने के लिए, अपने कार्यों के बारे में संदेह करना हमेशा महत्वपूर्ण है। – candlejack

4

@zedfoxus द्वारा प्रदान किया गया उत्तर संदर्भ को समझने के लिए उपयोगी है।

हालांकि, मुझे विश्वास नहीं है कि डेटा को सही तरीके से डिज़ाइन किया गया है, तो आपकी क्वेरी को विशिष्ट रिकॉर्ड की आवश्यकता होनी चाहिए।

ऐसा प्रतीत होता है कि आप तालिका spriden की प्राथमिक कुंजी का चयन कर रहे हैं, इसलिए यह सब डेटा अद्वितीय होना चाहिए। आप spraddr तालिका में भी शामिल हो रहे हैं; क्या उस तालिका में वास्तव में वैध डुप्लिकेट डेटा होता है? या क्या शायद उन अतिरिक्त डुप्लिकेट को फ़िल्टर करने के लिए आवश्यक अतिरिक्त कंसोलियम है?

यही कारण है कि मैं "distinct" के उपयोग के बारे में परेशान - spraddr तालिका अतिरिक्त कॉलम, जिसमें आप डेटा को फ़िल्टर करने का उपयोग करना चाहिए, और "distinct" कि छुपा हो सकता है शामिल हो सकते हैं।

इसके अलावा, आप एक बड़े परिणाम सेट उत्पन्न कर सकते हैं जिसे "विशिष्ट" खंड द्वारा फ़िल्टर किया जाना आवश्यक है, जो प्रदर्शन समस्याओं का कारण बन सकता है।उदाहरण के लिए, spriden में प्रत्येक पंक्ति के लिए spraddr में 1 मिलियन पंक्तियां हैं, और आपको 2 या 3 "असली" वाले खोजने के लिए "is_current" ध्वज का उपयोग करना चाहिए।

अंत में, जब मैं "समूह द्वारा" अलग-अलग विकल्प के रूप में उपयोग किया जाता है, तो यह परेशान हो जाता है, क्योंकि यह "गलत" नहीं है, बल्कि स्टाइलिस्टिक रूप से, मेरा मानना ​​है कि समूह को कुल कार्यों के लिए उपयोग किया जाना चाहिए। यह सिर्फ एक व्यक्तिगत वरीयता है।

+0

यह उत्तर वास्तव में अच्छा है; इसके बारे में सोचने के लिए एक कदम वापस लेता है: हमारे पास डुप्लीकेट क्यों हैं? – zedfoxus

0

बशर्ते आपके प्रश्न सही परिणाम, डिस्टिंट और ग्रुप एक ही परिणाम सेट प्रदान करते हैं, लेकिन आपके सहयोगी यह बताते हुए सही हैं कि DISTINCT समस्याओं को छुपाता है। यदि आप शामिल हैं और ग्रुप बाय का उपयोग कर रहे हैं, तो आप अपेक्षा से अधिक जानकारी प्राप्त करेंगे। यदि आप शामिल हैं और DISTINCT का उपयोग कर रहे हैं तो SQL इंजन एक असंबद्ध (या आंशिक रूप से बाध्य) शामिल होगा, परिणाम को संकीर्ण करेगा, और फिर अपेक्षित उत्तर के साथ आ जाएगा।

आवश्यकतानुसार अधिक डेटा उत्पन्न करने के स्पष्ट प्रदर्शन में गिरावट से परे, आप अपने tempdb को भरने का जोखिम भी चलाते हैं (यानी: हार्ड ड्राइव पर कमरे से बाहर चलना जहां आपका tempdb रहता है)।

उत्पादन में ग्रुप बाय का उपयोग करें।

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