sql-server – 跨多个表的SQL Server全文查询 – 为什么这么慢?

前端之家收集整理的这篇文章主要介绍了sql-server – 跨多个表的SQL Server全文查询 – 为什么这么慢?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试了解我正在构建的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,'search') VFT 
        ON V.ID = VFT.[KEY]
WHERE EFT.[KEY] IS NOT NULL OR VFT.[KEY] IS NOT NULL
原文链接:https://www.f2er.com/mssql/84097.html

猜你在找的MsSQL相关文章