【问题标题】:Is there any alternative of 'like' operators in sql - for searching datasql中是否有任何“like”运算符的替代方法 - 用于搜索数据
【发布时间】:2012-10-16 01:01:19
【问题描述】:

我需要一些帮助,我正在根据条件获取数据

这里我使用 like 运算符,客户端可以使用任何单词进行搜索,因此我有以下逻辑,但这里的检索时间太长(需要 4 分钟)而无法获取太慢的数据。

我对表进行了所有索引,但仍然无法优化查询。

从作者中选择 * 其中(地址如'% Walmart%'或地址如'Walmart%'或地址如'%Walmart'或地址如'%Walmart.com%'或地址如'Walmart.com%'或地址如'%Walmart.com ' OR 地址如 '% Walmarts %' OR 地址如'Walmarts %' OR 地址如'% Walmarts' OR 地址如'% Walmarts.com %' OR 地址如'Walmarts.com %' OR 地址如'% Walmarts.com ')

-- 结果为 1 行

如果我遵循这个逻辑

从作者中选择 * 像'%Walmart%'这样的地址

-- 结果是 44 行 - 它正在获取所有行

但我只需要得到那一行

【问题讨论】:

  • 你为什么允许这种类型的搜索,这就是为什么它需要这么长时间。看看你喜欢多少列。
  • 您是否发现冗余子句提高了性能?搜索'%' + @word + '%' 应该几乎涵盖@word'% ' + @word'@word + ' %'。以此类推。
  • 我只需要检查一列,但由于这种情况,检索数据需要很长时间......如果你知道任何更好的解决方案,请告诉我......提前致谢跨度>
  • @HABO '%' + @word + '%' 将涵盖所有场景,甚至包括 @words@wordcom@wordscom,因为它会在字符串。
  • 与 10 个重叠的类似子句和不可索引的查询相比,使用单个条件和全文索引可能会有显着改进。

标签: sql sql-server sql-server-2008 tsql sql-server-2005


【解决方案1】:

我相信这是您在where 子句中唯一需要的东西,它应该涵盖包含该词的所有内容:

select * from authors
where address like '%' + @word + '%'

实际上你已经在 where 子句的第二行这样做了:

or like '%'+@word+'%'

这涵盖了所有内容,使所有其他内容都过分了。删除这些可能会加快速度:

declare @title varchar(20)

set @title = 'coll' set @title = LTRIM(rtrim(@title))

select * from authors
where address like '%'+@title+'%'

【讨论】:

    【解决方案2】:

    索引很可能无济于事。在许多情况下,当您使用 Like 语句时,无法使用索引。您允许的搜索类型非常低效。这个查询很可能会扫描地址表。如您所见,如果表中有大量行,这将需要很长时间。

    您最好查看全文searching

    【讨论】:

    • 我对该列进行了全文搜索,但仍然无法优化它
    • 全文索引后您的查询是什么?您是否使用了 contains 关键字?
    【解决方案3】:

    如果您想在文本列上获得适当的性能,则需要使用全文搜索。

    http://msdn.microsoft.com/en-us/library/ms142571.aspx

    【讨论】:

      【解决方案4】:

      索引对这样的通配符搜索没有帮助,请尝试查看全文搜索

      这将利用一个索引,它可能会做一个搜索

      address like @wordcom+' %
      

      这不会使用索引,它必须扫描整个索引

      address like '% '+@wordcom+' %'
      

      如上所述,改用全文搜索

      【讨论】:

        【解决方案5】:

        正如其他人所说,您所需要的只是

        select * from authors where address like '%' + @word + '%'
        

        如果优化器发现我们告诉您的内容,这可能不会加快速度。 (索引也无济于事,其他人建议使用全文搜索)。

        如果你不明白为什么上面的查询就是你所需要的,让我们看看你的查询:

        select * from authors
        where address like @word or address like '% '+ @word
         or address like @word+' %' or address like '%'+@word+'%'
         or address like '% '+@word+' %' or address like @words
         or address like '% '+@words or address like @words+' %'
         or address like '%'+@words+'%' or address like '% '+@words+' %'
         or address like @wordcom or address like '% '+@wordcom
         or address like @wordcom+' %' or address like '%'+@wordcom+'%'
         or address like '% '+@wordcom+' %' or address like @wordscom
         or address like '% '+@wordscom or address like @wordscom+' %'
         or address like '% '+@wordscom+' %'
        

        你确实有一个“like @word + '%'”,所以请注意,如果一条记录匹配“like @word”,它也会匹配“like @word + '%'”。所以@word 不会再添加任何结果。由于“或”,无论@word 尝试匹配的结果是相同的,还是您只得到来自@word+'%' 的结果。

        应用该逻辑,您的查询可以简化为:

        select * from authors
        where address like @word+' %' or address like '%'+@word+'%'
         or address like @words+' %' or address like '%'+@words+'%'
         or address like @wordcom+' %' or address like '%'+@wordcom+'%'
         or address like @wordscom+' %' or address like '% '+@wordscom+' %'
        

        同样,@word 不会添加 '%'+@word 尚未包含的任何内容,从而将查询简化为:

        select * from authors
        where address like '%'+@word+'%'
         or address like '%'+@words+'%'
         or address like '%'+@wordcom+'%'
         or address like '% '+@wordscom+' %'
        

        此外,由 '%'+@word+'s%'、'%'+@word+'.com%' 或 '%'+@word+'s.com%' 找到的任何内容都将由 '%'+@word+ 找到'%'。

        【讨论】:

        • 感谢您的逻辑,但如果我使用此 AND(HD.address like '% Walmart %' OR HD.address like 'Walmart %' OR HD.address like '% Walmart' OR HD.address like '% Walmart.com %' OR HD.address like 'Walmart.com %' OR HD.address like '% Walmart.com' OR HD.address like '% Walmarts %' OR HD.address like ' Walmarts %' OR HD.address like '% Walmarts' OR HD.address like '% Walmarts.com %' OR HD.address like 'Walmarts.com %' OR HD.address like '% Walmarts.com') -- 结果是 1 行,就好像我遵循 - AND HD.Title like '%Walmart%' - 结果是 44 行
        • 在上面的评论中,您在地址字段上的点赞和标题字段上的点赞之间切换。我确信 AND (HD.address like '% Walmart %') 将给出与所有类似语句的 OR 相同的结果。
        • 如果您能找到在一个查询中返回但在另一个查询中没有返回的记录(在 %@word@ 和 OR 版本之间),请告诉我们该字段的值是什么。我们中的许多人都说查询应该有完全相同的结果。
        【解决方案6】:

        如果您在 QUERY 中使用 LIKE,请使用双 %% 来包装要过滤的值。 这是最好的解决方案。如果您喜欢该解决方案,请投票。 例如,在我的情况下,这与主查询连接在一起

        filter_value = "'%%"+filter_value+"%%'"
        

        【讨论】:

          猜你喜欢
          • 2011-07-08
          • 2017-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多