2008-09-25 10 views
11

यहLIKE 'string' vs = 'string' का उपयोग करने के लिए ओरेकल में कोई प्रदर्शन प्रभाव?

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE '%some_value%'; 

इस

SELECT * FROM SOME_TABLE WHERE SOME_FIELD = 'some_value'; 

लेकिन क्या इस बारे में की तुलना में धीमी है?

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE 'some_value'; 

मेरा परीक्षण इंगित करता है कि दूसरे और तीसरे उदाहरण बिल्कुल वही हैं। यदि यह सच है, तो मेरा सवाल है, कभी भी "=" का उपयोग क्यों करें?

+0

आपने क्या परीक्षण किया? –

+0

1 - निष्पादन समय 2 - समझाया गया योजना – JosephStyons

उत्तर

17

जब आप बाइंड वैरिएबल का उपयोग करते हैं तो स्पष्ट अंतर होता है, जिसे आपको डेटा वेयरहाउसिंग या अन्य थोक डेटा संचालन के अलावा ओरेकल में उपयोग करना चाहिए। निष्पादन समय तक बी 1 है '% some_value%', या 'some_value' आदि, तो यह की एक अनुमान कर देगा:

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE :b1 

ओरेकल पता नहीं सकता है मूल्य:

के मामले ले लो परिणाम की कार्डिनालिटी हेरिस्टिक्स पर आधारित है और एक उचित योजना के साथ आती है जो बी के विभिन्न मूल्यों के लिए उपयुक्त हो सकती है या नहीं: बी, जैसे '% ए', '%', 'ए' इत्यादि।

इसी प्रकार मुद्दों को समानता के साथ लागू कर सकते हैं लेकिन परिणामस्वरूप कार्डिनिटीज की सीमा कॉलम आंकड़ों या अनोखी बाधा की उपस्थिति के आधार पर अधिक आसानी से अनुमानित है, le।

तो, व्यक्तिगत रूप से मैं = के लिए प्रतिस्थापन के रूप में LIKE का उपयोग शुरू नहीं करूंगा। कभी-कभी मूर्खतापूर्ण मूर्खतापूर्ण मूर्खतापूर्ण होता है।

+0

अच्छा जवाब! जब मैं सवाल पढ़ता था तो यह मूर्ख लग रहा था, लेकिन मैं अपनी अंगुली को बिल्कुल क्यों नहीं डाल सका। यह सही जवाब है। –

5

दोनों के लिए EXPLAIN PLAN देखें। वे एक ही निष्पादन योजना उत्पन्न करते हैं, इसलिए डेटाबेस में, वे वही बात हैं।

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

+0

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

+0

हाँ, यदि आप बाइंड वैरिएबल का उपयोग करते हैं, जैसा कि आपको करना चाहिए, तो अनुकूलक वास्तव में नहीं जानता कि आप इसे किस पास पारित करने जा रहे हैं। इसलिए, यह सिर्फ एक तरफ वाइल्ड कार्ड रखने के लिए जरूरी नहीं है। (बेशक ओरेकल ने उस विशेषता के आसपास काम किया हो सकता है)। –

1

क्या आपने इसे आजमाया है? परीक्षण करने का एकमात्र निश्चित तरीका है।

एक तरफ के रूप में, इनमें से कोई भी बयान एक ही पंक्तियों को वापस करने के लिए निश्चित नहीं है। बाहर का प्रयास करें:

insert into some_table (some_field) values ('some_value'); 
insert into some_table (some_fieled) values ('1some_value2'); 
insert into some_table (some_field) values ('some1value'); 

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE '%some_value%'; 

SELECT * FROM SOME_TABLE WHERE SOME_FIELD = 'some_value'; 

SELECT * FROM SOME_TABLE WHERE SOME_FIELD LIKE 'some_value'; 

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

+0

परिणाम में क्या अंतर दिखता है? आपके उदाहरण का परीक्षण करने के लिए मेरे पास एक सैंडबॉक्स सर्वर तक पहुंच नहीं है। – Luke

+0

'LIKE'% some_value% ''सभी तीन रिकॉर्ड लौटाता है,' = 'some_value' केवल दूसरा रिकॉर्ड देता है, जैसे 'कुछ_व्यू' पहले और तीसरे रिकॉर्ड लौटाता है। –

1

LIKE '% WHATEVER%' को एक पूर्ण अनुक्रमणिका स्कैन करना होगा।

यदि प्रतिशत नहीं है, तो यह बराबर की तरह कार्य करता है।

यदि% एक छोर पर है, तो सूचकांक एक श्रेणी स्कैन हो सकता है।

मुझे यकीन नहीं है कि अनुकूलक बाध्य क्षेत्रों को कैसे प्रबंधित करता है।

3

यदि यह सच है, तो मेरा सवाल है, क्यों कभी भी "=" का उपयोग करते हैं?

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

1

like औपचारिक रूप से वही है यदि आपके पास $% आदि जैसे वर्ण नहीं हैं, इसलिए यह एक बड़ी आश्चर्य नहीं है कि यह एक ही कीमत है।

मुझे डेविड एल्ड्रिज का जवाब दिलचस्प लगता है क्योंकि आपका एप्लिकेशन बाध्य चर का उपयोग करना चाहिए। like '%foobar' के साथ आप इंडेक्स में ऑर्डर करने का उपयोग नहीं कर सकते हैं। यदि क्वेरी प्री-कंपाइल है तो इससे अधिक इंडेक्स या टेबल पूर्ण स्कैन हो जाएंगे।

इसके अलावा, मैं यह खतरनाक यह एसक्यूएल इंजेक्शन और अजीब कीड़े को जन्म दे सकता (उदाहरण के लिए, अगर वहाँ एक उपयोगकर्ता जॉन कहा जाता है एक हैकर 'joh$' नामक उपयोगकर्ता बना सकते हैं और कोशिश कर सकते हैं में लॉग इन करने)

क्यों के रूप में लगता है जोख़िम लें? '=' स्पष्ट है और इनमें से कोई भी समस्या नहीं है।

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