内部联接的全文搜索非常慢

时间:2011-02-15 09:50:48

标签: sql-server full-text-search sql-server-2008-r2

我有以下查询执行速度非常慢:

SELECT Id FROM
    (
        SELECT  E.MessageId
        FROM    [MessageEnvelopes] AS E INNER JOIN
                [Folders] AS F ON F.Id = E.FolderId
        WHERE   F.MailboxId = 1
    ) AS SUB1 INNER JOIN
    (
        SELECT  M.Id
        FROM    [Messages] AS M 
        WHERE   CONTAINS(M.*, '"my*" AND "search*"')
    ) AS SUB2
    ON SUB1.MessageId = SUB2.Id

基本上,这会将消息选择查询(SUB1)与全文搜索(SUB2)结合在一起。为清晰起见,子查询已分离(子查询连接在一起时会发生相同的行为)。此查询大约需要15秒,而两个子查询在单独执行时立即返回。

涉及的表很小(最多2000行)。所有外键都有索引。执行计划没有出现瓶颈。我不知道为什么这个查询运行得这么慢。

1 个答案:

答案 0 :(得分:1)

我猜测查询计划显示在评估FullTextMatch之前将三个表连接在一起。如果单独执行查询,则强制计划在联接之前针对Messages评估FullTextMatch。根据表中的数据量以及where子句对MailboxId的“选择性”,这可能对你有好处或坏处。如果您看到分离的查询有更好的性能,则可以使用两个表变量来存储中间结果并查询连接输出的变量。