【问题标题】:SQL Server like statement behavior for %%%% 的 SQL Server like 语句行为
【发布时间】:2010-09-16 20:47:57
【问题描述】:

在性能方面,like 运算符在应用于具有多个 % 占位符的字符串时表现如何?

例如:

select A from table_A where A like 'A%' 

与选择花费相同的时间

select A from table_A where A like 'A%%' 

???

【问题讨论】:

  • 为什么要/需要在字符串末尾多于 1%?
  • 原因是我正在编写一个动态连接字符串以符合最终查询的代码。由于这种混乱的流程,可能会出现多次“%%”,我担心这可能会对应用程序的最终性能产生影响。

标签: sql sql-server where-clause sql-like


【解决方案1】:

您的查询:

select A from table_A where A like 'A%' 

和

select A from table_A where A like 'A%%'
                                      ^ optimizer will remove second redundant %

等价,优化器会在第二个查询中删除第二个%

就像它会从以下位置删除 1=1:

select A from table_A where A like 'A%%' and 1=1

但是,这个查询非常不同:

select A from table_A where A like '%A%' 

当使用'A%' 时,它将使用索引查找以A 开头的所有内容,就像使用电话簿的人会快速查找名称的开头一样。但是,当使用'%A%' 时,它将扫描整个表以查找包含A 的任何内容,因此速度较慢且不使用索引。就像如果你必须在电话簿中找到每个包含 A 的名字,那将需要一段时间!

【讨论】:

  • 感谢您的回答。这正是我试图理解的。如果优化器会摆脱重复的 %.您能否分享任何链接以阅读有关优化器的更多详细信息?
  • 查看此网站:sommarskog.se/index.html。动态搜索条件文章将详细介绍优化器的工作原理
  • 很好的链接!非常感谢!
【解决方案2】:

它会一视同仁。如果列 A 上有索引,它将使用该索引,就像使用单个通配符一样。但是,如果您要添加前导通配符,则无论索引是否存在,都会强制执行表扫描。

【讨论】:

    【解决方案3】:

    在大多数情况下,您使用的模式不会影响查询的性能。性能的关键是正确使用索引。在您的示例中,列上的索引将运行良好,因为它将查找以“A”开头的值,然后匹配完整模式。周围可能有一些更具挑战性的模式,但它们之间的性能差异可以忽略不计。

    通配符会影响性能的一个重要条件是。而且,那是它在模式的开头。例如,'%A' 不会从索引中获得任何好处,因为它表示您希望匹配以任何有效字符开头的任何值。必须评估所有行以满足此条件。

    【讨论】:

    • 和原因和索引扫描,而不是索引查找。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 2011-10-18
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多