ユーザー検索の上位結果のフルテキスト インデックスを含むテーブルに対してクエリを実行し、その末尾にワイルドカード検索の結果を追加しています。
これが私の少し単純化された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
これはすべて機能し、しばらくの間稼働しています。
ここがトリッキーな部分です。最近、これが Web サイトで最もコストのかかるクエリの 1 つであることを発見しました。クエリ プランを調べたところ、クエリの LIKE '%%' 部分で 50 ~ 80% のコストが発生していることがわかりました。ワイルドカード検索は遅くなる傾向があるため、これは大きな驚きではありません。問題は、UNION ALL の前半がそれだけで十分な行を返したときに、UNION ALL の後半を実行する必要がないことです。
前半 (全文検索) で必要なすべての行が返されたときに、UNION ALL を実行しない方法はありますか?