MySQL

2009-01-17 21 views
9

में IN और NOT IN के लिए आकार सीमा क्या है, मैं अपने आवेदन में स्मृति अपवाद से बाहर हूं, जब IN या NOT IN की स्थिति बहुत बड़ी है। मैं जानना चाहता हूं कि इसके लिए सीमा क्या है।MySQL

उत्तर

7

शायद आप अपनी क्वेरी को पूरा करने के लिए एक और तरीके से बेहतर होंगे?

मेरा सुझाव है कि आप अपने मिलान मानों को एकल-कॉलम तालिका में लोड करें, और उसके बाद कॉलम को नई तालिका में एकल कॉलम पर पूछे जाने वाले कॉलम में शामिल हों।

बजाय

SELECT a, b, c FROM t1 WHERE d in (d1, d2, d3, d4, ...) 

निर्माण 1 कॉलम के साथ एक अस्थायी तालिका, यह "dval" कॉल

 
dval 
---- 
d1 
d2 
d3 
SELECT a, b, c FROM t1 
INNER JOIN temptbl ON t1.d = temptbl.dval 
+0

धन्यवाद। हम समस्या के लिए एक ही समाधान की योजना बना रहे हैं। हालांकि, मौजूदा इंस्टॉलेशन में एक नई तालिका जोड़ना, कुछ अतिरिक्त सत्यापन और समय की आवश्यकता होगी - इसलिए अस्थायी कामकाज हमने क्वेरी को विभाजित करने के बारे में सोचा। –

+0

मैं रीमे नहीं करता निश्चित रूप से मेबर, लेकिन मुझे लगता है कि एक अस्थायी तालिका को अनुमतियों के रास्ते में ज्यादा आवश्यकता नहीं होगी, क्योंकि यह tempdb में क्षणिक रूप से होता है।लेकिन अल्प अवधि में, मैं उम्मीद करता हूं कि आपने जो निर्धारित किया है उस पर लूपिंग एक स्वीकार्य तर्क गणना काम करेगी। – dkretz

+0

या यदि आपको एक बार में सभी की आवश्यकता है, तो आप कई बयान पर यूनियन कर सकते हैं। – dkretz

4

सीमाओं के बारे में पूछने के लिए सुलभ होने से या तो एक SQL क्वेरी या डेटाबेस डिजाइन कर रही है एक अच्छा संकेतक है कि आप इसे गलत कर रहे हैं।

+0

@PhoenixRedeemer हाँ, मैं मानता हूं कि मेरा दृष्टिकोण गलत है। पूरे डिजाइन को बदलने में कुछ समय लगेगा, इसलिए मैंने सोचा कि कुछ कामकाज अस्थायी रूप से समस्या को हल कर सकता है –

0

मैंने आईडी की बड़ी सूची के साथ उपयोग किया है - मुझे संदेह है कि स्मृति समस्या स्वयं क्वेरी में नहीं है। आप परिणाम कैसे प्राप्त कर रहे हैं?

इस क्वेरी, उदाहरण के लिए एक जीवित साइट से है:

SELECT DISTINCT c.id, c.name FROM categories c 
LEFT JOIN product_categories pc ON c.id = pc.category_id 
LEFT JOIN products p ON p.id = pc.product_id 
WHERE p.location_id IN (
955,891,901,877,736,918,900,836,846,914,771,773,833, 
893,782,742,860,849,850,812,945,775,784,746,1036,863, 
750,763,871,817,749,838,986,794,867,758,923,804,733, 
949,808,837,741,747,954,939,865,857,787,820,783,760, 
911,745,928,818,887,847,978,852 
) ORDER BY c.name ASC 

कोड पर मेरी पहली पास बहुत भोली है और वहाँ एक ही पृष्ठ पर के बारे में 10 इन प्रश्नों के हैं और डेटाबेस झपकी नहीं करता है ।

आप निश्चित रूप से 100k मूल्यों की एक सूची चला रहे हैं जो एक अलग कहानी होगी।

+1

@tobyhede: यहां तक ​​कि हमारे मामले में क्वेरी डेटा के छोटे सेट के लिए ठीक काम करती है। जब गिनती 4K से ऊपर थी तो मुझे इस स्मृति समस्या का सामना करना पड़ा। –

0

मुझे नहीं पता कि सीमा क्या है, लेकिन मैं इससे पहले भी इस समस्या में भाग गया हूं।

select * from foo 
    where id in (select distinct foo_id from bar where ...) 
2

मैं ही कभी में हैं और इनमें नहीं (100 पंक्तियों या तो नीचे) का उपयोग करते हैं हालत बहुत छोटा है: मैं इस तरह मेरी क्वेरी कुछ के पुनर्लेखन के लिए किया था। यह उन परिदृश्यों में अच्छा प्रदर्शन करता है। जब स्थिति बड़ी होती है तो मैं एक बाहरी जॉइन का उपयोग करता हूं क्योंकि क्वेरी को प्रत्येक ट्यूपल के लिए "IN" स्थिति को देखने की आवश्यकता नहीं होती है। आपको केवल उस तालिका को जांचना है जिसे आप सभी पंक्तियों से आना चाहते हैं।

"में" हालत में शामिल होने के लिए शामिल होने हालत शून्य

जैसे है "में नहीं" के लिए शून्य

नहीं है

/* Get purchase orders that have never been rejected */ 
SELECT po.* 
FROM PurchaseOrder po LEFT OUTER JOIN 
    (/* Get po's that have been rejected */ 
    SELECT po.PurchaesOrderID 
    FROM PurchaseOrder po INNER JOIN 
     PurchaseOrderStatus pos ON po.PurchaseOrderID = pos.PurchaseOrderID 
    WHERE pos.Status = 'REJECTED' 
    ) por ON po.PurchaseOrderID = por.PurchaseOrderID 
WHERE por.PurchaseOrderID IS NULL /* We want NOT IN */ 
0

मैं "मी एक समान समस्या हो रही है, लेकिन केवल मेरी में खंड में 100 3 अंक आईडी गुजर। जब मैं स्टैक ट्रेस को देखो, यह वास्तव में बंद अल्पविराम अलग मूल्यों में खंड में काटता है। मैं डॉन ' मुझे कोई त्रुटि नहीं मिलती है, मुझे बस वापस आने वाले सभी परिणाम नहीं मिलते हैं। क्या किसी को पहले इस तरह कोई समस्या है? अगर यह प्रासंगिक है, तो मैं सिम्फनी फ्रेमवर्क का उपयोग कर रहा हूं ... मैं यह देखने के लिए जांच रहा हूं कि यह एक प्रोपेल है या नहीं मुद्दा लेकिन सिर्फ यह देखना चाहता था कि यह