我正在查询一个表,其中包含用户搜索的顶级结果的全文索引,然后将通配符搜索的结果附加到该表的末尾。
这是我稍微简化的 SQL ......
SELECT TOP(@top) * FROM
(
SELECT TOP (@top) ft.[RANK], p.ProductID, p.Name FROM dbo.Product p
INNER JOIN FREETEXTTABLE(dbo.Product, *, @search_term) AS ft ON p.ProductID = ft.[KEY]
ORDER BY ft.[RANK] * p.Popularity DESC
UNION ALL
SELECT TOP (@top) 0 AS [RANK], p.ProductID, p.Name FROM dbo.Product p
WHERE (NOT p.ProductID IN (SELECT [KEY] FROM FREETEXTTABLE(dbo.Product, *, @search_term)))
AND (p.Name LIKE '%' + @search_term + '%')
ORDER BY p.Popularity DESC
) AS results
这一切都有效,并且已经存在了一段时间。
现在这是棘手的部分。我最近发现这是网站上更昂贵的查询之一。我查看了查询计划,发现查询的 LIKE '%%' 部分会产生 50-80% 的成本。这真的不是什么大惊喜,因为通配符搜索往往很慢。问题是当前半部分本身返回足够的行时,UNION ALL 的后半部分不需要运行。
当前半部分(全文搜索)返回我需要的所有行时,有没有办法不执行 UNION ALL?