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

标签 sql-server full-text-search

我正在尝试了解我正在构建的 SQL Server 2008 全文查询的性能。

以下查询使用全文索引,立即返回正确的结果:

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

即,名称中包含“query”一词的所有事件发生。以下查询使用来自不同表的全文索引,也立即返回:

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

即。所有名称中含有“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

关于sql-server - SQL Server 跨多个表的全文查询 - 为什么这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3061151/

相关文章:

python - 客户端 pyodbc 错误 : "Server does not exist or access denied."

c# - 池中的连接耗尽

sql - 如何运行查询以使用参数按列和升序/降序排序?

php - Lucene 中的多术语通配符查询?

powershell - 在Powershell中搜索许多大文本文件

PostgreSql XML 文本搜索

postgresql - 如何创建始终作为带有 Sequelize 的列生成的 tsvector?

c# - SqlDependency、最小数据库权限和角色拥有的模式

sql - 日期之间一天中的小时数

MySQL 全文搜索和连接