假设我有一个包含以下定义的表
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