Where 子句 SARGable 上的串联字符串是否可用?

Is concatenated string on where clause SARGable?

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

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

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

查询能否有效利用索引?

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

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

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

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

column operator value

value operator column.

列应该只是列名。运算符可以是 =, >, <=, >=, between, like。值可以是常量或任何表达式。 Like 应该像 like 'AAA%_。如果 Like%AAA_AAA,则 SARG 不可用。

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