【发布时间】:2015-04-02 06:53:39
【问题描述】:
假设我在两个 nvarchar 列 A 和 B 上有一个非聚集索引。
如果我的查询看起来像这样:
SELECT Columns FROM Table WHERE A + B = '1234'
查询能否有效利用索引?
或者我应该在where子句中分隔列
SELECT Columns FROM Table WHERE A = '12' AND B = '34'
我从测试中发现了非常令人惊讶的结果。两者都产生了相同的查询计划,但成本不同。大多数情况下,串联查询会更快,但有时,分离版本会更快。
【问题讨论】:
-
我不认为这样的查询可以是SARGable(意思是索引可以被使用);看起来它相当于
LIKE 'a%b'.. 但既然你有计划(以及具体的模式/数据/统计),让我们看看他们的战斗数字!确保随着表格大小的增加考虑成本;对于小型数据集,即使循环连接也很快(有时甚至更快)。但可惜的是,SQL Server 经常让我感到惊讶。通常很愉快。 -
嗯,我之前的评论自相矛盾:
LIKE 'a%b'当然可以在模式的第一部分使用索引。更正将是“我不认为这样的查询可以是 SARGable 在这两个术语上..”
标签: sql sql-server database performance sql-server-2008-r2