SQL文本匹配查询调优

SQL文本匹配查询调优,sql,sql-server,performance,sql-server-2008,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

我正在尝试进行一些自由文本搜索匹配,并想知道是否可以改进此查询(使用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
因此,我想知道是否有任何方法可以避免外部应用程序中的“
来自产品pm

我不能总是
内部连接@FreeText
,因为有时我们不使用自由文本搜索

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


另外,我确实知道MS SQL有一个FREETEXT()搜索,但不幸的是,我目前无法使用它。

这里有一个没有外部应用的查询,在没有搜索条件时返回所有结果

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

注意:如果没有任何freetext条件,我倾向于不使用“freetext”查询,而是使用另一个查询(更简单)。如果您选择走这条路线-返回到
内部连接
并删除
或@WordCount=0
x2。

这里有一个不带外部应用的查询,在没有搜索条件时返回所有结果

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

注意:如果没有任何freetext条件,我倾向于不使用“freetext”查询,而是使用另一个查询(更简单)。如果你选择这样做-回到
内部连接
并删除
或@WordCount=0

x2。

是的,它工作得很好,如果你有其他建议,我很想听听。。。(我知道SQL的FREETEXT()搜索,但现在不能这么做)。是的,它工作得很好,如果你有其他建议,我很乐意听你说。。。(我知道SQL的FREETEXT()搜索,但现在不能这么做)。所以,如果你说在没有FREETEXT条件的情况下不要使用“FREETEXT”查询,你不是说创建多个要调用的查询,就是说构建动态SQL,对吗?不幸的是,考虑到整个过程中其他元素的性质,我不能沿着这些道路走下去(事实上,我在不久前从动态SQL转换了这一点)。我想在我所有的调整过程中,我忽略了左路的加入。谢谢你的建议,我将不得不介绍这两个!事实上,我刚刚想起为什么我不能做左连接——我负担不起该连接的行乘法结果。外部应用的好处是,我不会将行相乘,它最终会使查询保持相当快的速度。如果您有任何其他想法或建议,我将不胜感激!GroupBy处理行乘法问题。每个ID在结果中都是唯一的。从这些结果和我的经验来看,似乎每当我执行行乘法时,我的查询速度就会减慢。实际上,我在同一个查询中有一些外部应用程序,因为它们避免了任何行乘法。即使最后是group by,任何行乘法都可能产生负面影响。从我的版本到你的版本导致从4秒增加到14秒。如果你还有其他想法,我很想听听!所以,如果你说在没有freetext条件时不要使用“freetext”查询,你要么说创建多个要调用的查询,要么说构建动态SQL,对吗?不幸的是,考虑到整个过程中其他元素的性质,我不能沿着这些道路走下去(事实上,我在不久前从动态SQL转换了这一点)。我想在我所有的调整过程中,我忽略了左路的加入。谢谢你的建议,我将不得不介绍这两个!事实上,我刚刚想起为什么我不能做左连接——我负担不起该连接的行乘法结果。外部应用的好处是,我不会将行相乘,它最终会使查询保持相当快的速度。如果您有任何其他想法或建议,我将不胜感激!GroupBy处理行乘法问题。每个ID在结果中都是唯一的。从这些结果和我的经验来看,似乎每当我执行行乘法时,我的查询速度就会减慢。实际上,我在同一个查询中有一些外部应用程序,因为它们避免了任何行乘法。即使最后是group by,任何行乘法都可能产生负面影响。从我的版本到你的版本导致从4秒增加到14秒。如果你还有其他想法,我很想听听!