2010-06-17 6 views
6

मैं एक SQL Server 2008 पूर्ण-पाठ क्वेरी के प्रदर्शन को समझने की कोशिश कर रहा हूं जिसे मैं बना रहा हूं।SQL सर्वर पूर्ण पाठ क्वेरी एकाधिक तालिकाओं में - इतनी धीमी क्यों?

निम्न क्वेरी, एक पूर्ण पाठ इंडेक्स का उपयोग करके सही परिणाम देता है तुरंत:

SELECT 
    O.ID, O.Name 
FROM 
    dbo.EventOccurrence O 
WHERE 
    FREETEXT(O.Name, 'query') 

यानी, शब्द 'जिज्ञासा' उनके नाम के साथ सभी EventOccurrences। और निम्न क्वेरी, एक अलग तालिका से पूर्ण-पाठ अनुक्रमणिका का उपयोग करके, सीधे लौटती है:

SELECT 
    V.ID, V.Name 
FROM 
    dbo.Venue V 
WHERE 
    FREETEXT(V.Name, 'query') 

यानी। उनके नाम पर 'क्वेरी' शब्द वाले सभी स्थान। लेकिन अगर मैं टेबल में शामिल होने और एक बार में दोनों पूर्ण-पाठ प्रश्नों करने की कोशिश है, यह 12 सेकंड के वापस जाने के लिए: http://uploadpad.com/files/query.PNG

अद्यतन: पाठ में में योजना

SELECT 
    O.ID, O.Name 
FROM 
    dbo.EventOccurrence O 
    INNER JOIN dbo.Event E ON O.EventID = E.ID 
    INNER JOIN dbo.Venue V ON E.VenueID = V.ID 
WHERE 
    FREETEXT(E.Name, 'search') 
    OR FREETEXT(V.Name, 'search') 

यहाँ कार्य योजना लागू है प्रपत्र:

|--Nested Loops(Left Semi Join, OUTER REFERENCES:([E].[ID], [V].[ID])) 
     |--Hash Match(Inner Join, HASH:([E].[ID])=([O].[EventID])) 
     | |--Hash Match(Inner Join, HASH:([V].[ID])=([E].[VenueID])) 
     | | |--Clustered Index Scan(OBJECT:([iScene].[dbo].[Venue].[PK_Venue] AS [V])) 
     | | |--Clustered Index Scan(OBJECT:([iScene].[dbo].[Event].[PK_Event] AS [E])) 
     | |--Clustered Index Scan(OBJECT:([iScene].[dbo].[EventOccurrence].[PK_EventOccurrence] AS [O])) 
     |--Concatenation 
      |--Table-valued function 
      |--Table-valued function 

मेरे पढ़ने से, मुझे लगता है कि नहीं था तो यह और भी इस तरह से कई तालिकाओं के पार एक मुक्त पाठ क्वेरी बनाने के लिए संभव हो गया था, इसलिए मुझे यकीन है कि मैं इस को सही ढंग से समझ रहा हूँ नहीं हूँ।

ध्यान दें कि अगर मैं इस अंतिम क्वेरी से WHERE क्लॉज को हटा देता हूं तो यह सभी परिणामों को एक सेकंड के भीतर वापस कर देता है, इसलिए यह निश्चित रूप से पूर्ण पाठ है जो इस मुद्दे को यहां उत्पन्न कर रहा है।

क्या कोई समझा सकता है (i) यह इतना धीमा क्यों है और (ii) अगर यह भी समर्थित है/अगर मैं इसे सही ढंग से समझ रहा हूं।

आपकी मदद के लिए अग्रिम धन्यवाद।

+0

क्या आप वास्तविक योजना पोस्ट कर सकते हैं। तस्वीर नहीं है? –

+0

ठीक है अभी इसे आपके लिए जोड़ा गया है। –

उत्तर

11

FREETEXTTABLE का उपयोग करके अपनी क्वेरी को फिर से लिखने का प्रयास करें और देखें कि क्या इससे मदद मिलती है।

SELECT 
    O.ID, O.Name 
FROM 
    dbo.EventOccurrence O 
    INNER JOIN dbo.Event E ON O.EventID = E.ID 
    INNER JOIN dbo.Venue V ON E.VenueID = V.ID 
    LEFT JOIN FREETEXTTABLE(dbo.Event, Name, 'search') EFT 
     ON E.ID = EFT.[KEY] 
    LEFT JOIN FREETEXTTABLE(dbo.Venue, Name, 'search') VFT 
     ON V.ID = VFT.[KEY] 
WHERE EFT.[KEY] IS NOT NULL OR VFT.[KEY] IS NOT NULL 
1

इस तुलना के लिए निष्पादन योजना कैसे करती है?

SELECT 
    O.ID, O.Name 
FROM 
    dbo.EventOccurrence O 
    WHERE O.EventID IN (
      SELECT 
       E.ID 
      FROM 
       dbo.Event E 
      WHERE 
       FREETEXT(E.Name, 'search') 
      UNION 
      SELECT 
       E.ID 
      FROM 
       dbo.Event E 
       INNER JOIN dbo.Venue V ON E.VenueID = V.ID 
      WHERE 
       FREETEXT(V.Name, 'search') 
       ) 
+0

आह, अकादमिक अब भी वैसे भी! –

+0

इस उत्तर के लिए धन्यवाद ... यह कुछ और कोशिश कर रहा था, लेकिन ऐसा लगता है कि यह गड़बड़ है, खासकर जब मेरी वास्तविक क्वेरी ऊपर पोस्ट किए गए पट्टी वाले संस्करण की तुलना में बहुत अधिक जटिल है। –

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