全文搜索加入非常缓慢
问题描述:
我有以下查询执行得非常缓慢:全文搜索加入非常缓慢
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行)。所有外键都有索引。执行计划显示没有瓶颈。我不知道为什么这个查询会运行得这么慢。
答
我猜测查询计划显示,在评估FullTextMatch之前,三个表连接在一起。如果分别执行查询,则强制计划在加入之前针对消息评估FullTextMatch。这可能对您有好处或不好,具体取决于表中的数据量以及where子句对MailboxId的“选择性”。如果您发现分隔查询的性能更好,则可以使用两个表变量来存储中间结果并查询连接输出的变量。
你尝试过使用CONTAINSTABLE()吗?这通常应该比CONTAINS() – 2011-02-15 09:58:43
@Greco表现更好,不会发生同样的事情。 – Carvellis 2011-02-22 08:26:23