是否在SARGable的where子句中连接了字符串?

时间:2015-04-02 06:53:40

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

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

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

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

查询能否有效地使用索引?

或者我应该将where子句

中的列分开
SELECT Columns FROM Table WHERE A = '12' AND B = '34'

我的测试结果令人惊讶。两者都产生了相同的查询计划,但成本不同。大多数情况下,连接查询会更快,但有时候,分离的版本会更快。

1 个答案:

答案 0 :(得分:2)

应用于分栏符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'不会使用索引。