如果[column1]被编入索引,则下一个查询可以使用index:
SELECT * FROM [table] WHERE [column1] LIKE 'starts%'
如果我引入变量,下面的查询将永远不会使用索引:
DECLARE @starts nvarchar(100)
SET @starts = 'starts%'
SELECT * FROM [table] WHERE [column1] LIKE @starts
我想根据用户输入实现StartsWith搜索,我不知道选择何种方式:
为LIKE正确转义用户输入,以便优化程序能够根据文字选择计划
使用WITH(FORCESEEK)
答案 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。
指示查询优化器将特定值用于本地 编译和优化查询时的变量。使用该值 仅在查询优化期间,而不是在查询执行期间。