2009-07-23 18 views
16

फुलटेक्स्ट इंडेक्स और वर्चर कॉलम पर नियमित इंडेक्स के बीच अंतर (और फायदे/नुकसान) क्या है? मैं किस सूचकांक का उपयोग करूंगा?एसक्यूएल सर्वर: सामान्य इंडेक्स बनाम फुलटेक्स्ट इंडेक्स

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

धन्यवाद!

उत्तर

19

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

SELECT * FROM [MyTable] WHERE [MyColumn] LIKE '%' + @SearchText + '%' 

यह sargable नहीं है। यह sargable है, लेकिन selectivity बहुत अच्छा नहीं हो सकता है:

SELECT * FROM [MyTable] WHERE [MyColumn] LIKE @SearchText + '%' 

आप एक पूर्ण-पाठ सूचकांक पूरी तरह से अलग तरह से उपयोग करें: आमतौर पर

SELECT * FROM [MyTable] WHERE CONTAINS([MyColumn], @SearchText) 
+0

क्या पूर्णतया अनुक्रमणिका का उपयोग न करने का कोई कारण है? – Alex

+0

वे बहुत सी डिस्क स्पेस का उपयोग करते हैं और फिर से गणना करने में धीमे होते हैं। –

+1

ऋणात्मक उल्लेख शानदार है - मुझे लगता है कि यह पर्याप्त सिखाया नहीं जाता है। व्यावहारिक कारणों का उल्लेख करने के लिए – AndrewPK

8

, जब एक सामान्य सूचकांक के साथ खोज, आप केवल खोज सकते हैं एक क्षेत्र में, उदाहरण के लिए "ए से शुरू होने वाले सभी शहरों को ढूंढें" या ऐसा कुछ।

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

इसके अतिरिक्त, नियमित खोज के साथ, आप जो भी कर सकते हैं उसमें आप काफी सीमित हैं - आप एक सटीक मिलान की तलाश कर सकते हैं या बस इसी तरह के बारे में सोच सकते हैं।

फुलटेक्स्ट इंडेक्स के साथ, आप शब्द फॉर्म (रन, रन इत्यादि) और अपने स्वयं के थिसॉरस को निर्दिष्ट करके समान शब्दों के लिए खोज सकते हैं। यदि यह कोई समस्या है तो आप कई भाषाओं के आधार पर खोज सकते हैं। आप उन प्रविष्टियों की खोज कर सकते हैं जिनमें दो या दो से अधिक शब्द हैं जो "एक दूसरे" हैं।

मार्क

+1

+1, केवल वाक्यविन्यास और संगत संचालन पर टिप्पणी करने के बजाय, FULLTEXT अनुक्रमणिका क्यों करें। – dayuloli

3

MSDN से:

पूर्ण-पाठ खोज के विपरीत, की तरह Transact-SQL विधेय चरित्र पैटर्न पर ही काम करता है। साथ ही, आप स्वरूपित बाइनरी डेटा क्वेरी करने के लिए LIKE predicate का उपयोग नहीं कर सकते हैं। इसके अलावा, एक बड़ी मात्रा में असंगठित टेक्स्ट डेटा के खिलाफ एक समान क्वेरी एक ही डेटा के बराबर पूर्ण-पाठ क्वेरी की तुलना में बहुत धीमी है।

टेक्स्ट डेटा की लाखों पंक्तियों के विरुद्ध एक प्रश्न पूछने में कुछ मिनट लग सकते हैं; जबकि एक पूर्ण-पाठ क्वेरी को उसी डेटा के विरुद्ध केवल सेकंड या उससे कम समय लग सकता है, जो लौटाई गई पंक्तियों की संख्या के आधार पर हो सकता है।

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