SQL सर्वर पर पसंद बनाम कनेक्शन


210

निम्नलिखित में से कौन सा प्रश्न अधिक तेज़ है (LIKE vs CONTAINS)?

SELECT * FROM table WHERE Column LIKE '%test%';

या

SELECT * FROM table WHERE Contains(Column, "test");

12
एक उत्तर स्वीकार करें, क्या आप करेंगे?
AgentFire

7
वह वर्षों से आदमी में नहीं है।
क्रिस

जवाबों:


174

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

पहली क्वेरी, LIKE का उपयोग करते हुए, एक इंडेक्स का उपयोग करने में असमर्थ होगी, क्योंकि यह वाइल्डकार्ड से शुरू होता है, इसलिए हमेशा एक पूर्ण तालिका स्कैन की आवश्यकता होगी।


CONTAINSक्वेरी किया जाना चाहिए:

SELECT * FROM table WHERE CONTAINS(Column, 'test');

@edze - आपका मतलब है, वही पृष्ठ जो पहले से ही मेरा पहला उल्लेख है CONTAINS? इसका क्या? प्रश्न का मूल रूप ऐसा था Column CONTAIN("%test%",Column)>0जो मान्य के करीब नहीं था। यह अभी भी पूरी तरह से सही नहीं है।
डेमियन___अनुलिपि

इससे हमें SharePoint पर एक क्वेरी को सुलझाने में मदद मिली। एक और महान जवाब बैज है।
ouflak

14

SQL Server 2012 आवृत्ति पर दोनों क्वेरीज़ चलाने के बाद, मैं पुष्टि कर सकता हूं कि मेरे मामले में पहली क्वेरी सबसे तेज़ थी।

LIKEकीवर्ड के साथ क्वेरी में क्लस्टर इंडेक्स स्कैन दिखाया गया है।

CONTAINSभी पूरा टेक्स्ट मैच के लिए अतिरिक्त ऑपरेटरों के साथ संकुल अनुक्रमणिका स्कैन था और किसी मर्ज में शामिल हो।

योजना


8
क्लस्टर सूचकांक पत्ती पृष्ठों हैं तालिका। एक LIKEप्रमुख वाइल्डकार्ड वाली क्वेरी इंडेक्स भाग को कुशलता से उपयोग करने में सक्षम नहीं होगी। इसके लिए बस पूरी चीज को स्कैन करना होगा। निस्संदेह ऐसी कुछ परिस्थितियां हो सकती हैं जिसमें पूर्ण CI स्कैन एक पूर्ण पाठ सूचकांक का उपयोग करते हुए क्वेरी से बेहतर प्रदर्शन करता है (शायद उदाहरण के लिए पंक्तियों का एक बहुत उच्च अनुपात मेल खाता है) यह काफी हद तक अपवाद होगा कुछ सामान्य नियम जो आप पुष्टि कर सकते हैं " "।
मार्टिन स्मिथ

अच्छी तरह से 200,000 से अधिक रिकॉर्ड प्राप्त करने वाली एक वास्तविक निष्पादन योजना को देख रहा हूं। दोनों प्रश्नों को एक बैच में रखते हुए, दोनों ने क्लस्टर इंडेक्स को स्कैन किया, लेकिन इसके अलावा "CONTAINS" क्वेरी में FULL TEXT MATCH और MERGE JOIN की अतिरिक्त लागत है।
MI C

यदि यह मर्ज ज्वाइन करता है तो SQL सर्वर अनुमान लगा रहा है कि पंक्तियों का x% से अधिक मिलान समाप्त हो जाएगा। (जहाँ X = टिपिंग बिंदु )। उस स्थिति में मैं कल्पना करूँगा कि दोनों का समान रूप से मिलान हो सकता है। निष्पादन योजना में दिखाई गई लागतें केवल अनुमान हैं (वास्तविक योजना में भी)। जबकि एफटी योजना में अतिरिक्त निष्पादन योजना ऑपरेटर हैं, इसके कुछ लाभ हैं। मर्ज ज्वाइन स्कैन के अंत से पहले बंद हो सकता है जब वह एफटी परिणामों से बाहर निकलता है और यह भी मूल्यांकन करने के लिए नहीं है LIKE
मार्टिन स्मिथ

1
मैंने sql 2012 में निष्पादन योजना की जांच के लिए एक समान क्वेरी चलाई है और इसने मुझे एक इंडेक्स सीक दिया है। शायद उदाहरण में यहाँ मेज लगभग खाली थी। कुछ मामलों में sql इंडेक्स का उपयोग करने के बजाय बहुत छोटी तालिका में एक इंडेक्स स्कैन का उपयोग करता है क्योंकि यह तेज है।
जुआन

8

मुझे लगता है कि आपकी क्वेरी में एक डैश ("-") होने में CONTAINSअधिक समय और उपयोग हुआ ।Mergeadventure-works.com

डैश एक ब्रेक शब्द है, इसलिए परिणामों की खोज करने और विलय करने की तुलना CONTAINSमें पूर्ण-पाठ सूचकांक की adventureखोज की works.com


8

इसके अलावा इसे बदलने की कोशिश करें:

    SELECT * FROM table WHERE Contains(Column, "test") > 0;

इसके लिए:

    SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;

पूर्व में " यह एक परीक्षण है " और " एक परीक्षण-मामला योजना है " जैसे मूल्यों के साथ रिकॉर्ड मिलेगा ।

बाद वाले को " मैं यह परीक्षण कर रहा हूं " और " यह सबसे बड़ा है " जैसे मूल्यों के साथ रिकॉर्ड भी मिलेगा ।


4
क्या खोज शब्द के काम के पहले और बाद में तारांकन करना पड़ता है? के लिए प्रलेखन पढ़ने में CONTAINS, यह केवल 'परीक्षण *' जैसे उपसर्ग शब्दों का उपयोग करने का उल्लेख करता है, न कि ' परीक्षण' जैसे प्रत्यय शब्द और '* परीक्षण ' की तरह पूर्ण प्रतिस्थापन खोज नहीं । मैंने इसे आजमाया नहीं है।
मैट forsythe

5
यदि आप CONTAINS ( docs.microsoft.com/en-us/sql/t-sql/queries/… ) के लिए प्रलेखन पढ़ते हैं , तो केवल उपसर्गों की खोज समर्थित है। मैंने इस प्रयोग को कई बार आजमाया है और यह संभव नहीं है कि इसमें "यह सबसे बड़ी बात है" (एसक्यूएल सेवर में) जिसमें
कॉन्टेन्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.