我在查詢一個表,其中包含用戶搜索的頂級結果的全文索引,然後我將通配符搜索的結果追加到結尾。如何使用TOP並有條件地忽略UNION ALL?
這裏是我的略微簡化的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的後半部分在前半部分自己返回了足夠的行時不需要運行。
有沒有辦法來不 ALL執行UNION當上半年(全文搜索)返回我需要的所有行?
可以存儲結果集進入臨時表,如果@@ ROWCOUNT <@top,UNION ALL與LIKE %%查詢,否則返回臨時表。也就是說,我沒有測試過,以確保該活動更有效率,這就是爲什麼這是一個評論,而不是一個答案。 –