【问题标题】:Avoiding using LIKE in SQLQueries避免在 SQL 查询中使用 LIKE
【发布时间】:2013-11-27 20:39:08
【问题描述】:

我可以在查询中使用什么来代替 LIKE? 因为 LIKE 对搜索条件的性能影响很差。

我的场景:

SELECT 
    *
FROM 
    MetaDataTag
WHERE 
    Name LIKE 'SUN RCC%'

我不能使用包含作为表格上的全文索引,我没有选择。

建议会很有帮助。

【问题讨论】:

  • 为什么不在某些列上然后在整个表上使用 like ?(select *) ?这需要时间
  • 另一个选项是使用CHARINDEX(参见:technet.microsoft.com/en-us/library/ms186323.aspx),如果返回值大于0,则它存在于字符串中。不幸的是,CHARINDEX('123','1')CHARINDEX('123','5') 都返回 0,它不能完全确定包含的字符串是开始还是不存在。您可以通过为要比较的字符串添加前缀来解决此问题,但我个人认为在这种情况下LIKE 是一个合理的解决方案。
  • 另一种选择是查看LEFT(str)的内容(参见:stackoverflow.com/questions/9493844/…
  • 你是说它在这个特定查询上的性能很差,还是你要建议LIKE 总体上性能很差?如果是后者,那根本就不是真的;假设您有一个支持在 Name 列上搜索的索引,优化器可以使用该索引来满足您的查询,因为您在模式的开头没有通配符。如果是前者,请检查以确保您的查询具有覆盖索引。

标签: sql sql-server tsql database-performance sql-like


【解决方案1】:

在您的特定情况下,LIKE 不是一个坏选择,因为您只使用后缀通配符。您的查询实际上可以使用Name 列上的索引。

看看这个视觉解释为什么它有效:http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning

【讨论】:

    【解决方案2】:

    试试这个..

    SELECT 
        *
    FROM 
        MetaDataTag
    WHERE PATINDEX('SUN RCC%', Name ) != 0
    

    【讨论】:

      猜你喜欢
      • 2020-11-21
      • 2012-12-13
      • 2020-09-22
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多