簡體   English   中英

跨多個表的SQL Server全文查詢 - 為什么這么慢?

[英]SQL Server full text query across multiple tables - why so slow?

我正在嘗試了解我正在構建的SQL Server 2008全文查詢的性能。

以下查詢使用全文索引立即返回正確的結果:

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秒:

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')

這是執行計划: http//uploadpad.com/files/query.PNG

更新:以文本形式的計划:

  |--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)如果這甚至支持/如果我甚至正確理解這一點。

在此先感謝您的幫助。

嘗試使用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

這個比較的執行計划如何?

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')
                )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM