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'
不会使用索引。
假设我在两个 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'
不会使用索引。