2012-04-01 18 views
8

द्वारा समूह को अनुकूलित करने के लिए आवश्यक है, मुझे लगता है कि मैं थोड़ा फंस गया हूं। यह काफी सीधी-आगे की क्वेरी है।MySQL सहायता उप क्वेरी

यदि मैं अलग-अलग प्रश्नों को चलाता हूं तो यह धीमा नहीं होता है, लेकिन जब मैं उन्हें बहुत धीमा करता हूं।

मुझे यकीन नहीं है कि इसे अनुकूलित कैसे करें। कोई भी सहायताकाफी प्रशंसनीय होगी। मैं मूल रूप से केवल कई धनवापसी दिखाना चाहता हूं। तो जहां faultid एक से अधिक बार मौजूद है।

SELECT 
    r.* 
FROM 
    faultrefunds_v2 r 
WHERE 
    r.id IN (SELECT r1.id 
      FROM faultrefunds_v2 r1 
      GROUP BY faultid 
      HAVING count(r1.faultid) > 1); 

से परिणामों की व्याख्या एक छवि

enter image description here

+0

प्राइमर r.id है वाई कुंजी? –

+0

हां, और दोषपूर्ण विदेशी कुंजी –

+0

मुझे लगता है कि आपके द्वारा लिखी गई क्वेरी प्रश्न का उत्तर नहीं देती है। ऐसा इसलिए है क्योंकि एक बार जब आप गलती से समूहित हो जाते हैं तो आप उस दोषपूर्ण के लिए केवल एक r.id वापस कर देंगे। –

उत्तर

1

मुझे लगता है, इस बल्कि योग्यता हासिल करता है की तुलना में एक फिर से लेखन के रूप में एक अनुकूलन, लेकिन वही है जो मैं इसके बजाय कोशिश करूंगा, वैसे भी:

SELECT 
    r.* 
FROM faultrefunds_v2 r 
WHERE EXISTS (
    SELECT * 
    FROM faultrefunds_v2 r1 
    WHERE r1.faultid = r.faultid 
    AND r1.id <> r.id 
); 
+0

यह भी काम किया। –

+0

मैंने जो प्रश्न लिखा है उससे यह तेज़ क्यों है? वे काफी समान दिखते हैं? –

+1

आपकी क्वेरी ग्रुपिंग का उपयोग करती है, जो कि अपेक्षाकृत महंगी ऑपरेशन है, साथ शुरू करने के लिए। इसके अलावा, उस प्रकार की एक सबक्वायरी को तालिका के मिलान के लिए पंक्ति सेट बनाने के लिए पूरी तालिका को स्कैन करना चाहिए। दूसरी ओर, मेरी क्वेरी अर्द्ध-जॉइन का उपयोग करती है ('EXISTS' predicate के रूप में)। अर्ध-जुड़ने में, कम से कम एक के रूप में जल्द से जल्द एक खोज के लिए मिलान की खोज की जा रही है, जिसे आप अनुमान लगा सकते हैं, उन मामलों में नाटकीय रूप से क्वेरी को तेज कर सकते हैं जहां कुछ/पंक्तियों के लिए कई मिलान मौजूद हैं। –

1

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

इस प्रयास करें:

select * from faultrefunds_v2 
where faultId in (
    select faultId from faultrefunds_v2 
    group by faultId 
    having count(*) > 1 
) 
+0

मुझे लगता है कि यह मेरी क्वेरी पर एक सुधार है, इसकी अधिक तार्किक और व्याख्यात्मक है। लेकिन यह अभी भी काफी धीमी है। इसे +1 –

2

IN खंड जिस तरह से आप का इस्तेमाल किया यह बहुत धीमी गति से हो सकता है, JOIN बजाय का उपयोग करें:

SELECT r.* FROM ( 
    SELECT r1.id AS id 
    FROM faultrefunds_v2 r1 
    GROUP BY faultid 
    HAVING count(r1.faultid) > 1 
) AS ids 
LEFT JOIN faultrefunds_v2 AS r 
ON(ids.id = r.id) 
+0

दिया गया यह काम करता है, यह बहुत तेज़ है। क्या आप कृपया बता सकते हैं कि आईएन क्लॉज जिस तरह से मैंने इसका इस्तेमाल किया है, उससे धीमा क्यों है, इसलिए मैं इसे फिर से करने से बच सकता हूं? –

+1

MySQL आमतौर पर इन क्लॉज के भीतर तत्वों को अनुक्रमित नहीं करता है, इसलिए इसे प्रत्येक पंक्ति की आईडी की तुलना 'आर' तालिका में प्रत्येक बार उप क्वेरी में मिली सभी आईडी के साथ की जानी चाहिए। मेरी विधि में MySQL को सभी उचित आईडी मिलते हैं, फिर सूचकांक का उपयोग करके बाहरी क्वेरी में प्रत्येक आईडी के लिए पूर्ण पंक्ति पुनर्प्राप्त करते हैं। – nobody

+0

यह उत्तर एंडरी एम प्रतिक्रिया के साथ सही जवाब है। मैं दो उत्तरों को स्वीकार नहीं कर सकता (हालांकि मुझे लगता है कि एक ही प्रश्न के लिए दो सही लेकिन अलग-अलग उत्तरों होना संभव है)। –

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