T-SQL LIKE使用变量和索引

时间:2015-01-16 19:56:34

标签: sql sql-server sql-server-2008 tsql sql-like

如果[column1]被编入索引,则下一个查询可以使用index:

SELECT * FROM [table] WHERE [column1] LIKE 'starts%'

如果我引入变量,下面的查询将永远不会使用索引:

DECLARE @starts nvarchar(100)
SET @starts = 'starts%'
SELECT * FROM [table] WHERE [column1] LIKE @starts

我想根据用户输入实现StartsWith搜索,我不知道选择何种方式:

  1. 为LIKE正确转义用户输入,以便优化程序能够根据文字选择计划

  2. 使用WITH(FORCESEEK)

  3. 使用OPTION(RECOMPILE)

1 个答案:

答案 0 :(得分:4)

还有另一个选择,你没有列出。您可以使用OPTIMIZE FOR选项强制查询优化器对预期变量值的性质做出正确的假设。这似乎很符合您的需求。

DECLARE @starts nvarchar(100)
SET @starts = 'starts%'
SELECT * FROM [table] WHERE [column1] LIKE @starts
OPTION (OPTIMIZE FOR (@starts = 'mnopq%'))

this blog中有更详细的描述。还有MSDN documentation

  

指示查询优化器将特定值用于本地   编译和优化查询时的变量。使用该值   仅在查询优化期间,而不是在查询执行期间。