我有一个查询,通过ADO.NET与SQL Server 2008R2一起使用。当我在行内使用LIKE子句时,它可以在不到一秒钟的时间内工作,并从200万行中返回5行。如果我像在.NET中一样在SSMS中在查询开头声明参数,那么它将需要很长时间。
这是相同的查询,但使用了参数化。
第一个(正常工作)是:
;WITH Results_CTE AS (
SELECT ld.* , ROW_NUMBER() OVER (ORDER BY PK_ID) AS RowNum
FROM list..List_Data ld
WHERE Name IS NOT NULL AND
Postcode LIKE 'SW14 1xx%'
) SELECT * FROM Results_CTE
第二个需要永远等待的是:
declare @postcode varchar(10) = 'SW14 1xx'
;WITH Results_CTE AS (
SELECT ld.* , ROW_NUMBER() OVER (ORDER BY PK_ID) AS RowNum
FROM list..List_Data ld
WHERE Name IS NOT NULL AND
Postcode LIKE @postcode +'%'
) SELECT * FROM Results_CTE
我认为这与SQL Server的内部工作机制有关,但我真的不知道。
like
上搜索会使优化器不太可能使用索引。在第一种情况下,它可以看到字符串开头没有通配符,因此它将使用索引。也许您可以“提示”使用索引。 - Klas LindbäckLIKE
作为一个范围查找,所以在存在非前导通配符的查询情况下不会受到惩罚(在存在前导通配符的情况下,范围是整个索引)。但是,在这种情况下,如果Postcode
上没有覆盖索引,则它不会使用它,因为它会高估需要进行的查找次数。 - Martin Smithpostcode
上添加 '%'(以防万一+ '%'
让优化器困惑)。这应该不会有影响,但值得一试。 - Klas Lindbäck