我有以下查询执行速度非常慢:
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行)。所有外键都有索引。执行计划没有出现瓶颈。我不知道为什么这个查询运行得这么慢。
答案 0 :(得分:1)
我猜测查询计划显示在评估FullTextMatch之前将三个表连接在一起。如果单独执行查询,则强制计划在联接之前针对Messages评估FullTextMatch。根据表中的数据量以及where子句对MailboxId的“选择性”,这可能对你有好处或坏处。如果您看到分离的查询有更好的性能,则可以使用两个表变量来存储中间结果并查询连接输出的变量。