SQL文本匹配查询调优

时间:2011-10-28 16:29:12

标签: sql sql-server performance sql-server-2008

我正在尝试进行一些自由文本搜索匹配,并想知道我是否可以改进此查询(使用MSSQL 2008):

@FreeText是一个表,其中每一行都是一个搜索词

DECLARE @WordCount = (SELECT COUNT(*) from @FreeText)

SELECT p.ID
FROM Product p

OUTER APPLY
(
    SELECT COUNT(ID) as MatchCount
    FROM Product pm
    INNER JOIN @FreeText ft
    ON pm.txt like '%'+ft.text+'%'
    WHERE pm.ID = p.ID
    AND (SELECT TOP 1 [text] FROM @FreeText) IS NOT NULL
)MC

WHERE MatchCount = @WordCount

所以我想知道是否有办法避免外部申请中的“FROM Product pm”?

我不能总是INNER JOIN @FreeText,因为有时候我们不会使用自由文本搜索。

任何想法或提示都将不胜感激,如果我能澄清任何事情,请告诉我。提前谢谢。

P.S。我知道MS SQL有一个FREETEXT()搜索,但遗憾的是我暂时无法使用它。

1 个答案:

答案 0 :(得分:1)

这是一个没有OUTER APPLY的查询,当没有搜索标准时返回所有结果。

DECLARE @FreeText TABLE
(
  [text] varchar(200)
)
INSERT INTO @FreeText SELECT 'a'
INSERT INTO @FreeText SELECT 'c'

-- what, null?  No.
DELETE FROM @FreeText WHERE [text] is null

DECLARE @WordCount int
SET @WordCount = (SELECT Count(*) FROM @FreeText)

SELECT p.ID
FROM Product p
LEFT JOIN @FreeText ft
ON p.txt like '%' + ft.text + '%'
WHERE ft.text is not null OR @WordCount = 0
GROUP BY p.ID
HAVING COUNT(*) = @WordCount OR @WordCount = 0

注意:当没有任何自由文本标准时,我不会使用“自由文本”查询 - 而是使用另一个查询(更简单)。如果您选择走这条路线 - 请返回INNER JOIN并放弃OR @WordCount = 0 x2。