为什么此查询的参数化版本比非参数化版本运行得慢?

rs.*_*rs. 6 sql t-sql sql-server sql-server-2005 sql-server-2008

示例查询:

CREATE PROCEDURE dbo.Test (@p varchar(10))
AS
DECLARE @param varchar(10)
SET @param = @p + '%'

SELECT * FROM table1 t1
INNER JOIN table2 t2 on t1.id = tr.id
WHERE t2.desc LIKE @param
Run Code Online (Sandbox Code Playgroud)

我有一个类似于上面的查询,当我在存储过程中使用它时,它无限期地运行而不提供任何输出.但如果我使用相同的查询,

SELECT * FROM table1 t1
INNER JOIN table2 t2 on t1.id = tr.id
WHERE t2.desc LIKE 'A%'  -- notice no parameter here
Run Code Online (Sandbox Code Playgroud)

这在不到一秒的时间内执行.

我的table2有140K记录,table1有250K

知道什么可能导致运营商运行缓慢?

Mar*_*ith 4

它在编译时不知道@param不会有前导通配符,因此当它编译批处理时,它会为您提供一个扫描而不是搜索的计划。

您可以尝试OPTION (RECOMPILE)OPTION (FORCESEEK)(SQL Server 2008)看看它是否为您提供更好的计划。