क्या ग्रुप BY और DISTINCT में कोई अंतर है


310

मैंने दूसरे दिन SQL के बारे में कुछ सरल सीखा:

SELECT c FROM myTbl GROUP BY C

के रूप में एक ही परिणाम है:

SELECT DISTINCT C FROM myTbl

क्या मैं उत्सुक हूं, क्या SQL इंजन कमांड को संसाधित करने के तरीके में कुछ अलग है, या क्या वे वास्तव में एक ही चीज हैं?

मैं व्यक्तिगत रूप से अलग वाक्यविन्यास को पसंद करता हूं, लेकिन मुझे यकीन है कि यह किसी भी चीज़ की तुलना में अधिक आदत से बाहर है।

EDIT: यह कुलियों के बारे में एक प्रश्न नहीं है। GROUP BYकुल कार्यों के साथ उपयोग समझा जाता है।


11
यह समुच्चय के बारे में एक प्रश्न नहीं है, यह एक समूह है जो एक अलग कार्य के रूप में एक ही कार्य करता है जब कोई कुल कार्य मौजूद नहीं है
Brettski

2
आप भी कर सकते हैं SELECT c FROM myTbl UNION SELECT c FROM myTblऔर एक ही परिणाम प्राप्त कर सकते हैं ... लेकिन चीजों को जटिल क्यों करें जब SELECT DISTINCT इतना आसान हो।
जारल

'निष्पादन का तार्किक क्रम GROUP BY' ' DISTINCTसेलेक्ट ' से पहले का है और चुनिंदा है।
प्रयुक्त_By_ पहले से ही

एक बहुत मामूली अंतर जो मैंने नहीं देखा है वह यह है कि DISTINCTपरिणाम वास्तव में फ़ील्ड का चयन करते हैं - अर्थात परिणाम सेट में मूल्य दिखाई देगा। GROUP BYवास्तव में क्षेत्र का चयन किए बिना डुप्लिकेट को प्रभावी ढंग से हटा सकता है। यह ज्यादातर मामलों में कुछ हद तक अप्रासंगिक है, लेकिन जैसा आप चाहते हैं वैसा ही हो सकता है। यदि आप के GROUP BYस्थान पर उपयोग कर रहे हैं DISTINCT, तो कोड में एक व्याख्यात्मक टिप्पणी संभवतः वारंट की गई है।
रिनोगो

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

जवाबों:


246

MusiGenesis की प्रतिक्रिया कार्यात्मक रूप से आपके प्रश्न के संबंध में सही है, जैसा कि कहा गया है; SQL सर्वर यह महसूस करने के लिए पर्याप्त स्मार्ट है कि यदि आप "ग्रुप बाय" का उपयोग कर रहे हैं और किसी भी एग्रीगेट फ़ंक्शन का उपयोग नहीं कर रहे हैं, तो आपका वास्तव में क्या मतलब है "डिस्टिक्ट" - और इसलिए यह एक निष्पादन योजना बनाता है जैसे कि आपने "डिस्टिंक्ट" का उपयोग किया है । "

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

एक हथौड़ा कभी-कभी एक स्क्रू में ड्राइव करने के लिए काम कर सकता है, लेकिन अगर आपको एक पेचकश काम मिला है, तो परेशान क्यों?

(इस सादृश्य के प्रयोजनों के लिए, Hammer : Screwdriver :: GroupBy : Distinctऔर screw => get list of unique values in a table column)


मैं आपसे Skeolan के साथ पूरी तरह से सहमत हूं। जब मैं इस कार्यक्षमता में आया तो मैं काफी हैरान था। यह कुछ ऐसा नहीं है जिसका मैं उपयोग करने की योजना बना रहा हूं, बल्कि इस नई जगह पर जिस तरह से मैं काम कर रहा हूं, उस तरह से किया गया है।
21

कम से कम ओरेकल 12 में ऐसे मामले दिखाई देते हैं जहां DISTINCT, UNION द्वारा अलग-अलग मान प्राप्त कर रहा है, और GROUP BY अलग तरीके से काम करता है। मेरे पास अभी एक मामला पहले आया था जहाँ DISTINCT और UNION द्वारा अलग होने के कारण एक दैवीय त्रुटि हुई, लेकिन GROUP BY ने काम किया; मैं एक दृश्य से केवल 1 कॉलम का चयन कर रहा था और किसी भी एकत्रीकरण का उपयोग नहीं कर रहा था; मैं अभी भी चकित हूं कि इसकी आवश्यकता क्यों है, लेकिन यह पुष्टि करता है कि निष्पादन में कुछ अंतर है। जैसा कि अन्य लोग बताते हैं, यह आपको समूह बाय कॉलम का चयन करने की अनुमति नहीं देता है, हालांकि यह एकत्रीकरण के बिना शायद ही कभी आवश्यक होना चाहिए।
जीरोके

1
जब यह SQL की बात आती है तो आपके पास हमेशा एक पेचकश और हथौड़ा दोनों उपलब्ध होते हैं। एक स्क्रू में ड्राइव करने के लिए एक हथौड़ा का उपयोग क्यों करें?
15

बस आप के संबंध में स्पष्ट होने के लिए सादृश्य - क्या आपका हथौड़ा == GroupBy और पेचकश == इस मामले में विकृत है?
आशा है कि

वाह, इस दस साल पुराने सवाल में अभी भी पैर हैं! "डिस्टिंक्ट" पेचकश है, यदि "अद्वितीय मूल्यों की सूची" स्क्रू है। मैं सादृश्य को स्पष्ट करने के लिए उत्तर को अपडेट करूंगा।
स्कीलॉन

136

GROUP BYआप कुल काम करता है, का उपयोग करने देता है की तरह AVG, MAX, MIN, SUM, और COUNT। दूसरी ओर DISTINCTसिर्फ डुप्लिकेट को निकालता है।

उदाहरण के लिए, यदि आपके पास खरीद रिकॉर्ड का एक गुच्छा है, और आप जानना चाहते हैं कि प्रत्येक विभाग द्वारा कितना खर्च किया गया था, तो आप कुछ ऐसा कर सकते हैं:

SELECT department, SUM(amount) FROM purchases GROUP BY department

यह आपको प्रति विभाग एक पंक्ति देगा, जिसमें विभाग का नाम और amountउस विभाग के लिए सभी पंक्तियों में सभी मानों का योग होगा ।


2
ग्रुप बीवाई का उपयोग मैं समझता हूं, यह सवाल इस तथ्य पर आधारित है कि यह कोई अलग-अलग डेटासेट देता है जब कोई एग्रीगेट फ़ंक्शन नहीं होता है।
२०:

2
क्योंकि GROUP BY का तात्पर्य उस स्तंभ के मूल्यों पर एक DISTINCT से है, जिसे आप (cacophony के लिए क्षमा करें) द्वारा समूहित कर रहे हैं।
जो पिनेडा

क्या DISTINCTसमुच्चय कार्यों का उपयोग करना संभव नहीं है ? इस तरह:select distinct department, SUM(amount) from ...
Shafizadeh

@ सज्जाद, आप ऐसा कर सकते हैं, लेकिन अभी भी आपके पास ग्रुप बाय होना है, इसलिए DISTINCT आपके लिए कुछ नहीं करता है।
जीरोके

44

कोई अंतर नहीं है (SQL सर्वर में, कम से कम)। दोनों प्रश्न एक ही निष्पादन योजना का उपयोग करते हैं।

http://sqlmag.com/database-performance-tuning/distinct-vs-group

हो सकता है कि वहाँ है , एक फर्क अगर वहाँ शामिल उप प्रश्नों हैं:

http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/

कोई अंतर नहीं है (ओरेकल-शैली):

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:32961403234212


40

मात्र डुप्लिकेट निष्कासन कार्यक्षमता बिंदु से क्या अंतर है

इस तथ्य के अलावा कि इसके विपरीत DISTINCT, प्रति समूहGROUP BY डेटा एकत्र करने की अनुमति देता है (जिसका उल्लेख कई अन्य उत्तरों द्वारा किया गया है), मेरी राय में सबसे महत्वपूर्ण अंतर तथ्य यह है कि दो ऑपरेशन "होते हैं" तार्किक क्रम में दो बहुत अलग चरणों में होते हैं एक बयान में निष्पादित किए जाने वाले कार्यों का संचालनSELECT

यहां सबसे महत्वपूर्ण ऑपरेशन हैं:

  • FROM(सहित JOIN, APPLYआदि)
  • WHERE
  • GROUP BY (डुप्लिकेट निकाल सकते हैं)
  • एकत्रीकरण
  • HAVING
  • विंडो फ़ंक्शन
  • SELECT
  • DISTINCT (डुप्लिकेट निकाल सकते हैं)
  • UNION, INTERSECT, EXCEPT (डुप्लिकेट निकाल सकते हैं)
  • ORDER BY
  • OFFSET
  • LIMIT

जैसा कि आप देख सकते हैं, प्रत्येक ऑपरेशन का तार्किक क्रम प्रभावित करता है कि इसके साथ क्या किया जा सकता है और बाद के कार्यों को कैसे प्रभावित करता है। विशेष रूप से, यह तथ्य कि GROUP BYऑपरेशन "SELECT (प्रक्षेपण) से पहले" होता है " का अर्थ है:

  1. यह प्रक्षेपण पर निर्भर नहीं करता है (जो एक फायदा हो सकता है)
  2. यह प्रक्षेपण से किसी भी मान का उपयोग नहीं कर सकता है (जो नुकसान हो सकता है)

1. यह प्रक्षेपण पर निर्भर नहीं करता है

एक उदाहरण जहां प्रक्षेपण पर निर्भर नहीं करना उपयोगी है यदि आप अलग-अलग मूल्यों पर विंडो फ़ंक्शन की गणना करना चाहते हैं:

SELECT rating, row_number() OVER (ORDER BY rating) AS rn
FROM film
GROUP BY rating

जब सकिला डेटाबेस के खिलाफ चलाया जाता है , तो यह पैदावार होती है:

rating   rn
-----------
G        1
NC-17    2
PG       3
PG-13    4
R        5

उसी को DISTINCTआसानी से हासिल नहीं किया जा सकता है:

SELECT DISTINCT rating, row_number() OVER (ORDER BY rating) AS rn
FROM film

वह प्रश्न "गलत" है और कुछ इस तरह देता है:

rating   rn
------------
G        1
G        2
G        3
...
G        178
NC-17    179
NC-17    180
...

यह वह नहीं है जो हम चाहते थे। DISTINCTआपरेशन "के बाद क्या होता" तो हम नहीं रह गया है हटा सकते हैं, प्रक्षेपण DISTINCTरेटिंग खिड़की समारोह पहले से ही गणना की और पेश किया गया था क्योंकि। उपयोग करने के लिए DISTINCT, हमें क्वेरी के उस हिस्से को घोंसला बनाना होगा:

SELECT rating, row_number() OVER (ORDER BY rating) AS rn
FROM (
  SELECT DISTINCT rating FROM film
) f

साइड-नोट: इस विशेष मामले में, हम भी उपयोग कर सकते हैंDENSE_RANK()

SELECT DISTINCT rating, dense_rank() OVER (ORDER BY rating) AS rn
FROM film

2. यह प्रक्षेपण से किसी भी मान का उपयोग नहीं कर सकता है

SQL की कमियों में से एक समय में इसकी वाचालता है। उसी कारण के लिए जैसा हमने पहले देखा है (अर्थात् तार्किक संचालन का क्रम), हम उस चीज़ को "आसानी से" समूह में नहीं कर सकते हैं जिसे हम प्रोजेक्ट कर रहे हैं।

यह अमान्य SQL है:

SELECT first_name || ' ' || last_name AS name
FROM customer
GROUP BY name

यह मान्य है (अभिव्यक्ति को दोहराते हुए)

SELECT first_name || ' ' || last_name AS name
FROM customer
GROUP BY first_name || ' ' || last_name

यह मान्य है, भी (अभिव्यक्ति का नामकरण)

SELECT name
FROM (
  SELECT first_name || ' ' || last_name AS name
  FROM customer
) c
GROUP BY name

मैंने इस विषय के बारे में एक ब्लॉग पोस्ट में अधिक गहराई से लिखा है


मुझे यह देख कर ईमानदारी से आश्चर्य हुआ कि निष्पादन के आदेश पर इस प्रश्न पर तुरंत चर्चा नहीं की गई। धन्यवाद, बहुत अच्छी तरह से भी समझाया। आपकी बात पर 2. कुछ (एक?) डीबी क्या पूरे क्वेरी में चुनिंदा उपनामों के उपयोग की अनुमति देता है (एक जिसे मैं जानता हूं कि वह तेराडाटा है, लेकिन यह एक अपवाद है)।
प्रयुक्त_By_ पहले से ही

@Used_By_Already: ज़रूर, कुछ डेटाबेस ऐसा करते हैं। कई डेटाबेस केवल उन हिस्सों में उन उपनामों के उपयोग की अनुमति देते हैं (उदाहरण के लिए, WHEREलेकिन शायद नहीं GROUP BY)। किसी भी मामले में, मुझे लगता है कि यह एक बुरा विचार है और मेरा सुझाव है कि पोर्टेबिलिटी और रखरखाव कारणों के लिए उस सुविधा का उपयोग न करें। "अचानक" यह काम नहीं करेगा, उदाहरण के लिए जब एक कुल समारोह या विंडो फ़ंक्शन को अलियासिंग करता है।
लुकास एडर

never using that feature for portability and maintenance reasons!! 100% सहमत ... और मैं अब आपके ब्लॉग को भी, महान कार्य को एन्जॉय कर रहा हूँ। चीयर्स।
प्रयुक्त_By_Already

32

DISTINCTयदि आप केवल डुप्लिकेट निकालना चाहते हैं तो उपयोग करें । का प्रयोग करें GROUPY BYअगर आप कुल ऑपरेटरों लागू करना चाहते हैं ( MAX, SUM, GROUP_CONCAT, ..., या एक HAVINGखंड)।


19

मुझे उम्मीद है कि उनके निष्पादन में सूक्ष्म अंतर की संभावना है। मैंने Oracle 10g में इन पंक्तियों के साथ दो कार्यात्मक समकक्ष प्रश्नों के लिए निष्पादन योजनाओं की जाँच की:

core> select sta from zip group by sta;

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    58 |   174 |    44  (19)| 00:00:01 |
|   1 |  HASH GROUP BY     |      |    58 |   174 |    44  (19)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| ZIP  | 42303 |   123K|    38   (6)| 00:00:01 |
---------------------------------------------------------------------------

core> select distinct sta from zip;

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    58 |   174 |    44  (19)| 00:00:01 |
|   1 |  HASH UNIQUE       |      |    58 |   174 |    44  (19)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| ZIP  | 42303 |   123K|    38   (6)| 00:00:01 |
---------------------------------------------------------------------------

बीच का ऑपरेशन थोड़ा अलग है: "एचएएसएच ग्रुप बाय" बनाम "एचएएसएच UNIQUE", लेकिन अनुमानित लागत आदि समान हैं। फिर मैंने इन्हें ट्रेसिंग के साथ निष्पादित किया और वास्तविक ऑपरेशन काउंट्स दोनों के लिए समान थे (सिवाय इसके कि दूसरे को कैशिंग के कारण कोई शारीरिक रीडिंग नहीं करनी थी)।

लेकिन मुझे लगता है कि क्योंकि ऑपरेशन के नाम अलग-अलग हैं, इसलिए निष्पादन कुछ अलग कोड पथों का पालन करेगा और इससे अधिक महत्वपूर्ण अंतरों की संभावना खुलती है।

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


14

आपके द्वारा पोस्ट की गई क्वेरी के लिए, वे समान हैं। लेकिन अन्य प्रश्नों के लिए जो सही नहीं हो सकते हैं।

उदाहरण के लिए, यह समान नहीं है:

SELECT C FROM myTbl GROUP BY C, D

14

मैंने उपरोक्त सभी टिप्पणियां पढ़ीं, लेकिन समूह बी और डिस्टिंक्ट के बीच मुख्य अंतर को एकत्रीकरण बिट से अलग किसी को नहीं देखा।

डिस्टिक्ट सभी पंक्तियों को फिर से डी-डुप्लिकेट करता है जबकि समूह द्वारा पंक्तियों को डी-डुप्लिकेट करें जैसा कि वे एल्गोरिदम द्वारा एक-एक करके पढ़ा जाता है।

इसका मतलब है कि वे विभिन्न परिणाम उत्पन्न कर सकते हैं!

उदाहरण के लिए, नीचे दिए गए कोड विभिन्न परिणाम उत्पन्न करते हैं:

SELECT distinct ROW_NUMBER() OVER (ORDER BY Name), Name FROM NamesTable

 SELECT ROW_NUMBER() OVER (ORDER BY Name), Name FROM NamesTable
GROUP BY Name

यदि तालिका में 10 नाम हैं, जिनमें से 1 दूसरे का डुप्लिकेट है तो पहली क्वेरी 10 पंक्तियों को लौटाती है जबकि दूसरी क्वेरी 9 पंक्तियों को देती है।

कारण वही है जो मैंने ऊपर कहा है ताकि वे अलग तरह से व्यवहार कर सकें!


11
ऐसा इसलिए है क्योंकि जब आप केवल Nameदूसरी क्वेरी में समूहीकरण कर रहे होते हैं , तो distinctकीवर्ड पहले क्वेरी के क्लॉज में Nameआपके कॉलम और कॉलम दोनों पर लागू होता है । यदि आपने दूसरे प्रश्न में पहले कॉलम को समूहीकृत किया होता, तो प्रश्न समान परिणाम देते। ROW_NUMBER()select

इस का एक नतीजा है order of executionएसक्यूएल खंड है, जिनमें से (एक सामान्य अर्थ में) FROM and ON (joins), WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY, LIMIT / OFFSET / TOPतो दूसरी क्वेरी नामों से समूह द्वारा संख्या में कम हो जाता है और बाद में ROW_NUMBER () एक पंक्ति में जिसके परिणामस्वरूप लागू किया जाता है अद्वितीय नाम के अनुसार। पहले क्वेरी में row_number () को अलग-अलग लागू होने से पहले लागू किया जाता है, और row_number () फ़ंक्शन की प्रकृति के कारण हर पंक्ति को एक अद्वितीय पूर्णांक मिलता है, इस प्रकार प्रत्येक पंक्ति को दोहराया गया है भले ही नाम मान दोहराया हो।
प्रयुक्त_By_ पहले से ही

12

यदि आप कई स्तंभों के साथ DISTINCT का उपयोग करते हैं, तो परिणाम सेट को समूहीकृत नहीं किया जाएगा क्योंकि यह GROUP BY के साथ होगा, और आप DISTINCT के साथ कुल कार्यों का उपयोग नहीं कर सकते।


11

उनके पास अलग-अलग शब्दार्थ हैं, भले ही वे आपके विशेष डेटा पर बराबर परिणाम हों।


6

GROUP BY का एक बहुत विशिष्ट अर्थ है जो DISTINCT फ़ंक्शन से अलग (हेह) है।

GROUP BY, क्वेरी के परिणामों को चुने हुए अभिव्यक्ति का उपयोग करके समूहीकृत करने का कारण बनता है, फिर समग्र कार्य लागू किए जा सकते हैं, और ये पूरे परिणाम के बजाय प्रत्येक समूह पर कार्य करेंगे।

यहाँ एक उदाहरण है जो मदद कर सकता है:

एक तालिका जो इस प्रकार दिखती है:

name
------
barry
dave
bill
dave
dave
barry
john

यह प्रश्न:

SELECT name, count(*) AS count FROM table GROUP BY name;

इस तरह उत्पादन होगा:

name    count
-------------
barry   2
dave    3
bill    1
john    1

जो स्पष्ट रूप से DISTINCT के उपयोग से बहुत अलग है। यदि आप अपने परिणामों को समूहित करना चाहते हैं, तो ग्रुप बीई का उपयोग करें, यदि आप केवल एक विशिष्ट कॉलम की एक अद्वितीय सूची चाहते हैं, तो DISTINCT का उपयोग करें। यह आपके डेटाबेस को आपकी आवश्यकताओं के लिए क्वेरी का अनुकूलन करने का मौका देगा।


6

जब आप DISTINCT से मतलब रखते हैं, तो भले ही वे समान काम करने के लिए ग्रुप BY का उपयोग न करें। मैं मान रहा हूं कि आप प्रश्नों से मिलीसेकेंड से हटने की कोशिश कर रहे हैं, और मुझे यह बताना होगा कि डेवलपर का समय कंप्यूटर के समय की तुलना में अधिक महंगा है।


5

यदि आप बिना किसी समुच्चय फ़ंक्शन के एक ग्रुप BY का उपयोग कर रहे हैं तो आंतरिक रूप से इसे DISTINCT के रूप में माना जाएगा, इसलिए इस मामले में GROUP BY और DISTINCT के बीच कोई अंतर नहीं है।

लेकिन जब आपको अपने अद्वितीय रिकॉर्ड खोजने के लिए इसका उपयोग करने के लिए बेहतर तरीके से DISTINCT क्लॉज प्रदान किया जाता है क्योंकि ग्रुप BY का उद्देश्य एकत्रीकरण को प्राप्त करना है।


4

समूहीकृत संचालन में समूह का उपयोग किया जाता है - जैसे कि जब आप स्तंभ C द्वारा टूटे हुए Bs की एक गिनती प्राप्त करना चाहते हैं

select C, count(B) from myTbl group by C

विशिष्ट यह है कि यह कैसा लगता है - आपको अनूठी पंक्तियाँ मिलती हैं।

Sql सर्वर 2005 में, ऐसा लगता है कि क्वेरी ऑप्टिमाइज़र मेरे द्वारा चलाए गए सरलीकृत उदाहरणों में अंतर को अनुकूलित करने में सक्षम है। यदि आप सभी स्थितियों में उस पर भरोसा कर सकते हैं, तो डन्नो।


3

उस विशेष क्वेरी में कोई अंतर नहीं है। लेकिन, निश्चित रूप से, यदि आप कोई समग्र कॉलम जोड़ते हैं तो आपको समूह का उपयोग करना होगा।


3

टेराडाटा परिप्रेक्ष्य में :

परिणाम सेट बिंदु से, यह कोई फर्क नहीं पड़ता कि आप Teradata में DISTINCT या GROUP BY का उपयोग करते हैं। उत्तर सेट समान होगा।

प्रदर्शन के दृष्टिकोण से, यह समान नहीं है।

यह समझने के लिए कि प्रदर्शन पर क्या प्रभाव पड़ता है, आपको यह जानने की आवश्यकता है कि DISTINCT या GROUP BY के साथ किसी कथन को निष्पादित करते समय Teradata पर क्या होता है।

DISTINCT के मामले में, पंक्तियों को बिना किसी प्रचार-प्रसार के बिना तुरंत हटा दिया जाता है, जबकि GROUP BY के मामले में, पहले चरण में एक प्रचार-प्रसार किया जाता है और उसके बाद ही AMPs में अद्वितीय मूल्यों का पुनर्वितरण किया जाता है।

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

संक्षेप में, Teradata में DISTINCT बनाम GROUP BY का मतलब है:

ग्रुप BY -> कई डुप्लिकेट के लिए DISTINCT -> नहीं या कुछ डुप्लिकेट केवल। कई बार DISTINCT का उपयोग करते समय, आप AMP पर स्पूल स्पेस से बाहर निकलते हैं। कारण यह है कि पुनर्वितरण तुरंत होता है, और तिरछा करने से एएमपी अंतरिक्ष से बाहर निकल सकता है।

यदि ऐसा होता है, तो आपके पास ग्रुप बीवाई के साथ संभवतः बेहतर मौका है, क्योंकि पहले चरण में डुप्लिकेट पहले ही हटा दिए गए हैं, और कम डेटा को एएमपी में स्थानांतरित किया गया है।


क्या है Teradata?
ब्रेट्सकी

Teradata एक रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) है, जो विभिन्न क्लाइंट प्लेटफ़ॉर्म से कई समवर्ती उपयोगकर्ताओं का समर्थन करने में सक्षम है। Teradata ANSI मानक के साथ संगत है और पूरी तरह से समानांतर वास्तुकला पर बनाया गया है।
राम गद्याराम

2

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

मुझे लगता है कि यह 'ग्रुप बाय एग्रीगेट्स के लिए' गलत जोर है। लोक को पता होना चाहिए कि सेट फ़ंक्शन (MAX, MIN, COUNT, आदि) को छोड़ा जा सकता है ताकि वे कोडर के इरादे को समझ सकें जब यह है।

आदर्श ऑप्टिमाइज़र समान SQL निर्माणों को पहचान लेगा और हमेशा उसी के अनुसार आदर्श योजना को चुनेगा। पसंद के अपने वास्तविक जीवन एसक्यूएल इंजन के लिए, आपको परीक्षण करना होगा :)

पीएस ध्यान दें कि DISTINCT कीवर्ड की स्थिति का चयन क्लॉज में अलग-अलग परिणाम दे सकता है। इसके विपरीत:

SELECT COUNT(DISTINCT C) FROM myTbl;

SELECT DISTINCT COUNT(C) FROM myTbl;

1

आप केवल इसलिए ध्यान दे रहे हैं कि आप एकल कॉलम का चयन कर रहे हैं।

दो क्षेत्रों का चयन करने का प्रयास करें और देखें कि क्या होता है।

ग्रुप बाय का उपयोग इस तरह किया जाना है:

SELECT name, SUM(transaction) FROM myTbl GROUP BY name

जो प्रत्येक व्यक्ति के लिए सभी लेनदेन का योग दिखाएगा।


यह समुच्चय का प्रश्न नहीं है। आपके उदाहरण में, SELECT c, d FROM mytbl GROUP BY C, D; वास्तव में उसी डेटा सेट को चुनें जैसा कि सिलेक्ट डिस्टिंक्ट सी, डी मायटब्ल से; यह प्रश्न का मूल सिद्धांत है
ब्रेट्स्की

1

मुझे पता है कि यह एक पुरानी पोस्ट है। लेकिन ऐसा होता है कि मेरे पास एक क्वेरी थी जो समूह का उपयोग करती थी बस अलग-अलग मूल्यों को वापस करने के लिए जब उस क्वेरी का उपयोग करते हुए टॉड और ओरेकल रिपोर्ट में सब कुछ ठीक काम करता था, तो मेरा मतलब है कि एक अच्छा प्रतिक्रिया समय। जब हम ओरेकल 9i से 11g पर चले गए, तो टॉड में प्रतिक्रिया समय उत्कृष्ट था, लेकिन रिपोर्ट में पिछले संस्करण का उपयोग करते समय रिपोर्ट को समाप्त करने में लगभग 35 मिनट लग गए, इसमें लगभग 5 मिनट लगे।

समाधान यह था कि समूह को DISTINCT द्वारा बदल दिया जाए और अब यह रिपोर्ट लगभग 30 सेकंड में चले।

मुझे आशा है कि यह उसी स्थिति वाले किसी व्यक्ति के लिए उपयोगी है।


1

उपयोग के संदर्भ में, GROUP BY का उपयोग उन पंक्तियों को समूहित करने के लिए किया जाता है, जिनकी आप गणना करना चाहते हैं। DISTINCT कोई गणना नहीं करेगा। यह कोई डुप्लिकेट पंक्तियाँ नहीं दिखाएगा।

अगर मैं डुप्लिकेट के बिना डेटा प्रस्तुत करना चाहता हूं तो मैंने हमेशा DISTINCT का उपयोग किया।

अगर मैं आम की कुल मात्रा की गणना करना चाहता हूं, तो मैं ग्रुप BY का उपयोग करूंगा


0

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

अर्थात:

select distinct a, b, c from table;

के समान है:

select a, b, c from table group by a, b, c

सहमत, लेकिन क्या यह सी, बी, टेबल ग्रुप के ए, बी, सी
धीर

हां, यह वैसा ही होगा
कैयस जार्ड

0

फंतासी दक्षता पूरी तरह से अलग है। यदि आप डुप्लिकेट एक को छोड़कर केवल "रिटर्न वैल्यू" का चयन करना चाहते हैं, तो अलग-अलग उपयोग करना समूह द्वारा बेहतर है। क्योंकि "समूह द्वारा" शामिल (छांटना + निकालना), "अलग" में शामिल (हटाना)



0

कभी-कभी वे आपको समान परिणाम दे सकते हैं, लेकिन उनका उपयोग विभिन्न अर्थों / मामलों में किया जाता है। मुख्य अंतर वाक्य रचना में है।

नीचे दिए गए उदाहरण को ध्यान से देखें। DISTINCTमूल्यों के डुप्लिकेट सेट को फ़िल्टर करने के लिए उपयोग किया जाता है। (6, सीएस, 9.1) और (1, सीएस, 5.5) दो अलग-अलग सेट हैं। तो DISTINCTदोनों पंक्तियों GROUP BY Branchको प्रदर्शित करने जा रहा है जबकि केवल एक सेट प्रदर्शित करने जा रहा है।

 SELECT * FROM student; 
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    2 | mech   |  6.3 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    1 | cs     |  5.5 |
+------+--------+------+
5 rows in set (0.001 sec)

SELECT DISTINCT * FROM student; 
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    2 | mech   |  6.3 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    1 | cs     |  5.5 |
+------+--------+------+
5 rows in set (0.001 sec)

SELECT * FROM student GROUP BY Branch;
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    2 | mech   |  6.3 |
+------+--------+------+
4 rows in set (0.001 sec)

कभी-कभी GROUP BYक्लॉज द्वारा प्राप्त किए जा सकने वाले परिणाम DISTINCTकुछ अतिरिक्त क्लॉज या शर्तों का उपयोग किए बिना प्राप्त करना संभव नहीं होता है । उपरोक्त मामले में।

उसी परिणाम को प्राप्त करने के लिए जैसे आपको नीचे दिए गए खंड DISTINCTमें सभी स्तंभ नामों को पास करना होगा GROUP BY। अतः वाक्यगत अंतर देखें। आपको GROUP BYउस मामले में क्लॉज़ का उपयोग करने के लिए सभी कॉलम नामों के बारे में जानकारी होनी चाहिए ।

SELECT * FROM student GROUP BY Id, Branch, CGPA;
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    1 | cs     |  5.5 |
|    2 | mech   |  6.3 |
|    3 | civil  |  7.2 |
|    4 | eee    |  8.2 |
|    6 | cs     |  9.1 |
+------+--------+------+

इसके अलावा, मैंने पाया GROUP BYहै कि डिफ़ॉल्ट रूप से आरोही क्रम में परिणाम प्रदर्शित करता है जो DISTINCTनहीं करता है। लेकिन मुझे इस पर यकीन नहीं है। यह अलग-अलग विक्रेता वार हो सकता है।

स्रोत: https://dbjpanda.me/dbms/languages/sql/sql-syntax-with-examples#group-by


0

आम तौर पर हम DISTINCTतालिका में विशिष्ट कॉलम पर डुप्लिकेट को खत्म करने के लिए उपयोग कर सकते हैं ।

'ग्रुप द्वारा' के मामले में हम जैसे एकत्रीकरण कार्य लागू कर सकते हैं AVG, MAX, MIN, SUM, और COUNTविशिष्ट स्तंभ पर और स्तंभ नाम लाने और यह एक ही स्तंभ पर एकत्रीकरण समारोह परिणाम।

उदाहरण :

select  specialColumn,sum(specialColumn) from yourTableName group by specialColumn;

-1

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

सरल उदाहरण का प्रयास करें

@Tmpresult तालिका घोषित करें (आईडी टिंटिंट)

@Tmpresult में सम्मिलित करें 5 यूनियन चुनें सभी 2 का चयन करें सभी का चयन करें 3 यूनियन का चयन करें सभी 4 का चयन करें

@Tmpresult से अलग आईडी का चयन करें


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