2015-06-19 9 views
16

मैं सोच रहा था एक गतिशील मान के साथ एसक्यूएल में एक प्रश्न बनाने के लिए सर्वोत्तम प्रथाओं थे क्या के लिए प्रदर्शन, मान लीजिए कि मैं एक मूल्य (nvarchar (अधिकतम))एसक्यूएल सर्वर और गतिशील खोजें

मूल्य है: "912,345,678 "

select * from AllData 
where Number like '%912345678%' 

मूल्य:" माइकल "

select * from AllData 
where Name like '%Michael%' 

मूल्य: "स्ट्रीट नंबर 10"

select * from AllData 
where Address like '%Street number 10%' 

यह approuches 9 अंक है कि इस

select * from AllData 
where Number like '912345678' 

मैं करने के लिए एक edmx का उपयोग जैसे% के बिना तेजी से होगा एक नंबर के लिए खोज के बाद से थोड़ा धीमा कर रहे हैं सी # में बाहरी डेटाबेस से कनेक्शन बनायें, इस तरह:

var Result = EDMXEntity.Entities.Where(x => 
(SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Name.ToString().ToLower()) > 0) 
|| (SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Number.ToString().ToLower()) > 0) 
|| (SqlFunctions.PatIndex("%" + Value.ToLower() +"%", x.Address.ToString().ToLower()) > 0)).Take(50).ToList(); 

मैं प्रदर्शन कैसे बढ़ा सकता हूं?

+1

आपकी सभी स्थितियां एक जैसी हैं। 'SqlFunctions.PatIndex ("% "+ उदाहरण.ToLower() +"% ", x.Name.ToString()। ToLower())> 0) ' – Amit

+1

' ऑलडाटा से * चुनें * जहां '912345678' 'की संख्या बराबर है 'ऑलडाटा से चुनें * जहां संख्या =' 9 12345678 '' तो यह हमेशा तेज़ रहेगा। – Max

+0

@ क्षमा करें मेरी बुराई, मैंने शर्तों को अद्यतन किया है। – BrunoMartinsPro

उत्तर

13

varchar/nvarchar फ़ील्ड पर वाइल्डकार्ड की खोज इस तरह की आलोचनाओं को पूरा करने वाले रिकॉर्ड के लिए हर चरित्र, अधिक या कम पर फिर से शुरू करने जा रही है।

  1. की प्रतिलिपि प्राप्त अनुक्रमित स्टोर करने के लिए एक प्रतिलिपि प्राप्त सूची बनाओ:

    खोजों के इन प्रकार के लिए एक महान (! और तेजी से) विकल्प है।

  2. प्रत्येक तालिका में कॉलम पर fulltext index डाल दें जिन्हें आपको खोजना है।
  3. जब आप वाइल्डकार्ड की बजाय खोज करते हैं तो CONTAINS कीवर्ड का उपयोग करें।

आपने विश्वसनीय स्रोतों की तलाश में उल्लेख किया है, here एक अच्छा पढ़ा है।

var Result = EDMXEntity.Entities.Where(
x => x.Name.Contains(Value) || 
x => x.Number.ToString().Contains(Value) || 
x => x.Address.Contains(Value)).Take(50).ToList(); 

लेकिन खोज इस तरह से आप अच्छी प्रदर्शन प्राप्त कभी नहीं होगा:

+1

का उपयोग करना होगा यदि आप स्ट्रिंग के भीतर एक स्ट्रिंग खोजना चाहते हैं, तो आप एक पूर्ण टेक्स्ट खोज कर रहे हैं। जो आपने अभी तक रखा है, उसे देखते हुए, सही काम करने के लिए पूर्ण टेक्स्ट खोज का मानक कार्यान्वयन है। – jerrylagrou

2

यदि LIKE और PATINDEX का उपयोग करके आपको प्रदर्शन की आवश्यकता नहीं मिली तो आपको शायद एसपी लिखना चाहिए जो एफटीएस का उपयोग करेगा।

2

साथ 'पसंद' एफई में आप उपयोग कर सकते शामिल हैं() खोज करने के लिए। आपको डीबी में डेटा खोजने या स्टोर करने के तरीके को बदलने की जरूरत है। उदाहरण के लिए यदि आप सुनिश्चित हैं कि उपयोगकर्ता नाम की तलाश में है, तो आप केवल 'नाम' कॉलम में खोज सकते हैं।

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