2010-06-19 16 views
119

SQL डेटाबेस या OR SQL Where -clause में बेहतर प्रदर्शन करता है, तो बड़े डेटाबेस से निपटने पर?बनाम या एसक्यूएल में जहां

क्या उनके द्वारा निष्पादित किए जाने के तरीके में कोई अंतर है?

+0

मेरी पहली अनुमान है कि हो सकता है या बेहतर प्रदर्शन करती है, जब तक कि एसक्यूएल इंजन में या दृश्य के पीछे में धर्मान्तरित होता । क्या आपने इन दोनों की क्वेरी योजना देखी है? – Raj

+0

[MYSQL या बनाम प्रदर्शन में संभावित डुप्लिकेट] (http://stackoverflow.com/questions/782915/mysql-or-vs-in-performance) –

उत्तर

125

मुझे लगता है आप निम्नलिखित के प्रदर्शन के बीच अंतर जानना चाहता हूँ:

WHERE foo IN ('a', 'b', 'c') 
WHERE foo = 'a' OR foo = 'b' OR foo = 'c' 

manual for MySQL के अनुसार यदि मान स्थिर हैं IN सूची टाइप करता है और फिर बाइनरी खोज का उपयोग करता है। मुझे लगता है कि OR किसी विशेष आदेश में उन्हें एक-एक करके मूल्यांकन करता है। तो कुछ परिस्थितियों में IN तेज है।

जानने का सबसे अच्छा तरीका यह है कि आपके डेटाबेस पर दोनों को अपने विशिष्ट डेटा के साथ प्रोफ़ाइल को तेज़ी से देखने के लिए प्रोफाइल करना है।

मैंने 1000000 पंक्तियों के साथ एक MySQL पर दोनों की कोशिश की। जब कॉलम अनुक्रमित होता है तो प्रदर्शन में कोई स्पष्ट अंतर नहीं होता है - दोनों लगभग तत्काल होते हैं। जब कॉलम अनुक्रमित नहीं होता है तो मुझे ये परिणाम मिलते हैं:

SELECT COUNT(*) FROM t_inner WHERE val IN (1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000); 
1 row fetched in 0.0032 (1.2679 seconds) 

SELECT COUNT(*) FROM t_inner WHERE val = 1000 OR val = 2000 OR val = 3000 OR val = 4000 OR val = 5000 OR val = 6000 OR val = 7000 OR val = 8000 OR val = 9000; 
1 row fetched in 0.0026 (1.7385 seconds) 

तो इस मामले में OR का उपयोग करने वाली विधि लगभग 30% धीमी है। अधिक शब्दों को जोड़ने से अंतर बड़ा हो जाता है। परिणाम अन्य डेटाबेस और अन्य डेटा पर भिन्न हो सकते हैं।

+15

यदि अनुकूलक अपने नमक के लायक है तो उन्हें वही करना चाहिए। –

+21

@inflagranti: दुर्भाग्यवश कोई अनुकूलक सही नहीं है। अनुकूलक बेहद जटिल कार्यक्रम हैं और प्रत्येक कार्यान्वयन में अपनी ताकत और कमजोरियां होंगी। यही कारण है कि मैं कहता हूं कि आपको एक विशिष्ट कार्यान्वयन पर प्रोफाइल करना चाहिए। मैं कल्पना करता हूं कि 'IN' विधि की अतिरिक्त संरचना संभावित रूप से संबंधित 'OR' खंडों के पूरे समूह की तुलना में अनुकूलित करना आसान बनाती है। मुझे आश्चर्य होगा कि कोई इंजन है जहां 'OR' विधि तेज है, लेकिन मुझे आश्चर्य नहीं है कि कई बार या धीमा है। –

+2

@MarkByers अनुकूलक हमेशा ''' 'के साथ एकाधिक' OR 'को प्रतिस्थापित नहीं कर सका? – mayu

1

OR समझ में आता है (पढ़ने योग्यता बिंदु से), जब कम मूल्यों की तुलना की जा सकती है। IN उपयोगी esp है। जब आपके पास गतिशील स्रोत होता है, जिसके साथ आप मानों की तुलना करना चाहते हैं।

एक और विकल्प अस्थायी तालिका के साथ JOIN का उपयोग करना है।
मुझे नहीं लगता कि प्रदर्शन एक समस्या होनी चाहिए, बशर्ते आपके पास आवश्यक अनुक्रमणिका हों।

26

निष्पादन योजना को देखने का सबसे अच्छा तरीका है।


मैं साथ इसे करने की कोशिश ओरेकल, और यह बिल्कुल वैसा ही था।

CREATE TABLE performance_test AS (SELECT * FROM dba_objects); 

SELECT * FROM performance_test 
WHERE object_name IN ('DBMS_STANDARD', 'DBMS_REGISTRY', 'DBMS_LOB'); 

हालांकि क्वेरी IN का उपयोग करता है, निष्पादन योजना का कहना है कि यह OR उपयोग करता है:

--------------------------------------------------------------------------------------  
| Id | Operation   | Name    | Rows | Bytes | Cost (%CPU)| Time  |  
--------------------------------------------------------------------------------------  
| 0 | SELECT STATEMENT |     |  8 | 1416 | 163 (2)| 00:00:02 |  
|* 1 | TABLE ACCESS FULL| PERFORMANCE_TEST |  8 | 1416 | 163 (2)| 00:00:02 |  
--------------------------------------------------------------------------------------  

Predicate Information (identified by operation id):          
---------------------------------------------------          

    1 - filter("OBJECT_NAME"='DBMS_LOB' OR "OBJECT_NAME"='DBMS_REGISTRY' OR     
       "OBJECT_NAME"='DBMS_STANDARD')            
+1

ओरेकल में क्या होता है यदि आपके पास 3 से अधिक मान हैं जो आप परीक्षण कर रहे हैं ? क्या आपको पता है कि ओरेकल एक ही द्विआधारी खोज अनुकूलन को MySQL के रूप में करने में असमर्थ है या क्या यह दोनों मामलों में इसे निष्पादित करता है? –

+2

@ मार्क बिअर्स: मैंने 10 मानों के साथ एक ही प्रश्न की कोशिश की, फिर भी वही परिणाम। ध्यान दें, कि अनुकूलक ने मेरे मानों को वर्णानुक्रम में उपयोग किया। अगर ओरेकल ने उस फ़िल्टर के कुछ आंतरिक अनुकूलन किया तो मुझे आश्चर्य नहीं होगा ... –

+5

ओरेकल में 'इन्इलीस्ट आईटेटर' ऑपरेशन भी है, जो यह चुनता है कि अगर कोई इंडेक्स इस्तेमाल कर सकता है तो इसका चयन होगा। फिर भी, जब मैंने इसे आजमाया, तो 'IN' और' OR 'दोनों एक ही निष्पादन योजना के साथ समाप्त हो गए। –

5

मुझे लगता है कि ऑरैकल कम कुशल एक (जो भी है) को दूसरे में परिवर्तित करने के लिए पर्याप्त स्मार्ट है। इसलिए मुझे लगता है कि उत्तर प्रत्येक की पठनीयता पर निर्भर होना चाहिए (जहां मुझे लगता है कि IN स्पष्ट रूप से जीतता है)

5

OR ऑपरेटर को आईएन निर्माण की तुलना में अधिक जटिल मूल्यांकन प्रक्रिया की आवश्यकता है क्योंकि यह कई स्थितियों की अनुमति देता है, न केवल समान में।

यहां एक ऐसा तरीका है जिसका आप उपयोग कर सकते हैं या लेकिन यह अधिक के साथ संगत नहीं है। अधिक या बराबर, कम, कम या बराबर, जैसे कुछ और ओरेकल REGEXP_LIKE की तरह कुछ और। इसके अतिरिक्त यह मानते हैं कि हालात हमेशा एक ही मूल्य की तुलना नहीं कर सकते हैं।

क्वेरी ऑप्टिमाइज़र के लिए आईएन ऑपरेटर को प्रबंधित करना आसान है क्योंकि केवल एक ऐसा निर्माण है जो एक ही मूल्य पर = ऑपरेटर के साथ कई स्थितियों पर OR ऑपरेटर को परिभाषित करता है। यदि आप OR ऑपरेटर का उपयोग करते हैं तो ऑप्टिमाइज़र इस बात पर विचार नहीं कर सकता कि आप हमेशा एक ही मूल्य पर = ऑपरेटर का उपयोग कर रहे हैं और यदि यह गहरा और बहुत अधिक जटिल विस्तार नहीं करता है, तो शायद यह बहिष्कृत हो सकता है कि केवल = पहले से उल्लिखित बाइनरी खोज जैसे अनुकूलित खोज विधियों के परिणामी पूर्ववर्ती के साथ, सभी शामिल स्थितियों पर समान मूल्यों के लिए ऑपरेटर।

[संपादित करें] शायद एक अनुकूलक मूल्यांकन प्रक्रिया में अनुकूलित कार्यान्वित नहीं कर सकता है, लेकिन यह एक बार ऐसा नहीं हो सकता है (डेटाबेस संस्करण अपग्रेड के साथ)। इसलिए यदि आप ओआर ऑपरेटर का उपयोग करते हैं जो अनुकूलित अनुकूलित है तो आपके मामले में उपयोग नहीं किया जाएगा।

1

मैंने बड़ी संख्या में OR (350) में एक SQL क्वेरी की। पोस्टग्रेस 437.80ms करते हैं।

Use OR

अब में उपयोग करें:

Use IN

23.18ms

+1

यह वही बात नहीं है, क्योंकि आपने आईएन क्लॉज के लिए सबक्वायरी का उपयोग किया है। – gliljas

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