【问题标题】:Is concatenated string on where clause SARGable?where 子句 SARGable 上的连接字符串是否可用?
【发布时间】:2015-04-02 06:53:39
【问题描述】:

假设我在两个 nvarchar 列 A 和 B 上有一个非聚集索引。

如果我的查询看起来像这样:

SELECT Columns FROM Table WHERE A + B = '1234'

查询能否有效利用索引?

或者我应该在where子句中分隔列

SELECT Columns FROM Table WHERE A = '12' AND B = '34'

我从测试中发现了非常令人惊讶的结果。两者都产生了相同的查询计划,但成本不同。大多数情况下,串联查询会更快,但有时,分离版本会更快。

【问题讨论】:

  • 我不认为这样的查询可以SARGable(意思是索引可以被使用);看起来它相当于LIKE 'a%b' .. 但既然你有计划(以及具体的模式/数据/统计),让我们看看他们的战斗数字!确保随着表格大小的增加考虑成本;对于小型数据集,即使循环连接也很快(有时甚至更快)。但可惜的是,SQL Server 经常让我感到惊讶。通常很愉快。
  • 嗯,我之前的评论自相矛盾:LIKE 'a%b' 当然可以在模式的第一部分使用索引。更正将是“我不认为这样的查询可以是 SARGable 在这两个术语上..”

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


【解决方案1】:

应用于分栏符SARGability 的任何表达式、函数、计算。主要公式如下:

columnoperatorvalue

valueoperatorcolumn.

列应该只是列名。操作员可以是=, >, <=, >=, between, like。值可以是常量或任何表达式。 Like 应该类似于 like 'AAA%_。如果Like%AAA_AAA 它不是SARGable。

所以答案是:如果您可以将谓词拆分为WHERE A = '12' AND B = '34',则如果存在任何合适的索引,它将使用索引。这个WHERE A + B = '1234' 不会使用索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2013-08-24
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2015-08-03
    相关资源
    最近更新 更多