admin

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

sql

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

如果我的查询如下所示:

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

查询可以有效使用索引吗?

或者我应该将where子句中的列分开

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

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


阅读 155

收藏
2021-06-07

共1个答案

admin

应用于分栏符功能的任何表达式,函数,计算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'将不使用索引。

2021-06-07