2012-01-19 7 views
5

मुझे अपने SQL सर्वर डेटाबेस में कई अलग-अलग तालिकाओं को खोजने की आवश्यकता है। और मुझे परिणामों को क्रमबद्ध करने की आवश्यकता है कि मैच किस तालिका में हुआ था।एकाधिक टेबल्स में पूर्ण-पाठ खोज अनुकूलित करें

मैंने जो दृष्टिकोण लिया है वह नीचे दिखाया गया है। हालांकि, यह डेटा की मात्रा बढ़ने के साथ बहुत प्रभावी प्रतीत नहीं होता है।

क्या कोई इसे अनुकूलित करने के लिए किसी भी चाल का सुझाव दे सकता है?

-- Full-text query 
DECLARE @FtsQuery nvarchar(100) 
SET @FtsQuery = 'FORMSOF(INFLECTIONAL, detail)' 

-- Maximum characters in description column 
DECLARE @MaxDescription int 
SET @MaxDescription = 250 

SELECT 1 AS RankGroup, FTS.Rank, Id, Title, LEFT([Description], @MaxDescription) AS Description FROM Table1 
    INNER JOIN CONTAINSTABLE(Table1, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table1.Id 
UNION SELECT 2, FTS.Rank, Id, Title, NULL FROM Table2 
    INNER JOIN CONTAINSTABLE(Table2, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table2.Id 
UNION SELECT 3, FTS.Rank, Id, Title, LEFT([Description], @MaxDescription) FROM Table3 
    INNER JOIN CONTAINSTABLE(Table3, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table3.Id 
UNION SELECT 4, FTS.Rank, Id, Title, LEFT([Description], @MaxDescription) FROM Table4 
    INNER JOIN CONTAINSTABLE(Table4, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table4.Id 
UNION SELECT 5, FTS.Rank, Id, Title, LEFT([Description], @MaxDescription) FROM Table5 
    INNER JOIN CONTAINSTABLE(Table5, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table5.Id 
ORDER BY RankGroup, Rank DESC 

एक विचार जिसे मैंने माना था, एक अनुक्रमित दृश्य बनाना है और फिर दृश्य पर खोज करना है। लेकिन चूंकि दृश्य को इन UNION एस की आवश्यकता होगी, इसलिए यह देखना मुश्किल है कि यह और अधिक कुशल कैसे होगा।

+0

एक साधारण अनुकूलन जिसे आप सुरक्षित रूप से कर सकते हैं वह 'यूनियन' के साथ 'यूनियन 'को प्रतिस्थापित कर रहा है। अधिक जानकारी के लिए: http://stackoverflow.com/questions/49925/what-is-the-difference-between-union-and-union-all – niaher

उत्तर

7

यह एक कठिन समस्या है, क्योंकि CONTAINSTABLE एक समय में केवल एक तालिका की FTS अनुक्रमणिका खोज सकता है। आपका यूनियन समाधान तब तक ठीक है जब तक आपका प्रदर्शन स्वीकार्य नहीं है।

हमें एक ही प्रश्न में कई तालिकाओं से कई कॉलम कुशलतापूर्वक खोजने की आवश्यकता के एक ही मुद्दे का सामना करना पड़ा। हमने जो किया वह इन स्तंभों और तालिकाओं से एक ही पठन-केवल तालिका में सभी डेटा था। हमारे क्वेरी तो केवल एक ही CONTAINSTABLE कॉल

CONTAINSTABLE(AggregatedTable, AggregatedColumn, @FtsQuery) 

जरूरत हम एक अनुसूचित काम है कि हर 5-10 मिनट चलाता है और संवर्द्धित हमारे एकल केवल पढ़ने के लिए एकत्रित सामग्री तालिका में हमारे स्रोत तालिका से किसी भी संशोधित सामग्री समुच्चय है।

सामान्यतः ऐसा लगता है कि किसी भी उचित आकार के डेटाबेस और उपयोगकर्ता लोड में एफटीएस का उपयोग करना मतलब है कि आप हमेशा प्रदर्शन के साथ जूझ रहे हैं। यदि आपको लगता है कि इससे कोई फर्क नहीं पड़ता कि आप प्रदर्शन को स्वीकार्य नहीं कर सकते हैं, तो आपको Lucene जैसी अन्य तकनीकों की जांच करने की आवश्यकता हो सकती है।

+0

दिलचस्प। परिवर्तित डेटा को पकड़ने और इसे समग्र तालिका में धक्का देने के लिए आपने किस प्रकार का दृष्टिकोण लिया? और यह निर्धारित नौकरी कितनी देर तक चलती है? – mg1075

+1

हम एक संग्रहित proc का उपयोग करते हैं जो एसक्यूएल एजेंट द्वारा निर्धारित किया गया है जो denormalized तालिका को अद्यतन करने के लिए है। हमारे बेस डेटा में प्रत्येक पंक्ति पर एक डेटाटाइम स्टैंप होता है जो इंगित करता है कि पंक्ति को आखिरी बार स्पर्श किया गया था (डाला गया या अपडेट किया गया था) ताकि हम हर 5 या 10 मिनट में केवल वृद्धिशील आबादी को करने के लिए इसका इस्तेमाल कर सकें। हमारे शुरुआती भार में एक घंटे या उससे अधिक समय लग गया, लेकिन वृद्धिशील आबादी केवल 10 या 20 सेकंड लेती है। –

+0

इनपुट के लिए धन्यवाद। मुझे लगता है कि चिंता का एकमात्र मुद्दे हैं: (1) अद्यतन के लिए अर्हता प्राप्त रिकॉर्ड निर्धारित करने के लिए तालिकाओं से पूछताछ करने के लिए समय लगता है, और (2) यदि कोई डाउनटाइम था और सामान्य रूप से चलने वाला अपडेट - और देखा एक रिकॉर्ड में केवल इतना समय पहले - चलाने में विफल रहा। – mg1075

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