如何使用sql参数过滤以给定字符串开头的列,并且仍然能够充分利用该列上的索引?

时间:2018-03-01 16:41:32

标签: c# sql-server indexing

假设我有一个包含以下定义的表

CREATE TABLE Person (
    ...
    FirstName NVARCHAR(255),
    ...
);

CREATE INDEX IX_FirstName ON Person (FirstName);

如果我想让所有姓名以“Foo”开头的人都可以写下以下查询:

SELECT * FROM Person WHERE FirstName LIKE "Foo%"

以下查询非常快。 SQL Server能够对IX_FirstName执行索引搜索。

但是,因为搜索词直接来自用户输入,所以我决定使用SQL值参数:

string sql = "SELECT * FROM Person WHERE FirstName LIKE Concat(@searchterm,'%')"; 
SqlCommand cmd = new SqlCommand(sql)
cmd.Parameters.AddWithValue("@searchterm", "Foo")

这是(我认为)相当于:

DECLARE @searchterm NVARCHAR(255)
SET @searchterm = 'Foo'
SELECT * FROM Person WHERE FirstName LIKE Concat(@searchterm,'%')

这导致索引扫描(速度很慢)。 AFAIK因为参数值不是查询的一部分,SQL Server无法执行参数嗅探。搜索词可能是'%Foo%',这使得无法使用索引。

我也尝试了以下替代方案,但它没有帮助(使用索引扫描)。

SELECT * FROM Person WHERE CHARINDEX(@searchterm, DocumentName) = 1

0 个答案:

没有答案