假设我在两个nvarchar列A和B上有一个非聚集索引。
如果我的查询如下所示:
SELECT Columns FROM Table WHERE A + B = '1234'
查询可以有效使用索引吗?
或者我应该将where子句中的列分开
SELECT Columns FROM Table WHERE A = '12' AND B = '34'
我从测试中发现了非常令人惊讶的结果。两者都产生了相同的查询计划,但是成本不同。在大多数情况下,级联查询会更快,但有时分离版本会更快。
应用于分栏符功能的任何表达式,函数,计算SARG。主要公式如下:
SARG
column operator value 或者
column
operator
value
value operator column。
列应该只是列名。运算符可以=, >, <=, >=, between, like。值可以是常数,也可以是任何表达式。 Like应该像like 'AAA%_。如果Like是%AAA或_AAA不能SARG。
=, >, <=, >=, between, like
Like
like 'AAA%_
%AAA
_AAA
因此,答案是:如果可以将谓词拆分为WHERE A = '12' AND B = '34',则将在存在任何适当索引的情况下使用索引。这WHERE A + B = '1234'将不使用索引。
WHERE A = '12' AND B = '34'
WHERE A + B = '1234'