加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

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

发布时间:2021-03-06 12:56:51 所属栏目:编程 来源:网络整理
导读:我正在实行相识我正在构建的SQL Server 2008全文查询的机能. 以下查询行使全文索引当即返回正确的功效: SELECT O.ID,O.NameFROM dbo.EventOccurrence OWHERE FREETEXT(O.Name,'query') 即全部在其名称中带有“查询”字样的EventOccurrences.以下查询行使来自

我正在实行相识我正在构建的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

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读