全文搜索加入非常缓慢

问题描述:

我有以下查询执行得非常缓慢:全文搜索加入非常缓慢

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

你尝试过使用CONTAINSTABLE()吗?这通常应该比CONTAINS() – 2011-02-15 09:58:43

+0

@Greco表现更好,不会发生同样的事情。 – Carvellis 2011-02-22 08:26:23

我猜测查询计划显示,在评估FullTextMatch之前,三个表连接在一起。如果分别执行查询,则强制计划在加入之前针对消息评估FullTextMatch。这可能对您有好处或不好,具体取决于表中的数据量以及where子句对MailboxId的“选择性”。如果您发现分隔查询的性能更好,则可以使用两个表变量来存储中间结果并查询连接输出的变量。