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

时间:2010-10-19 16:24:49

标签: sql sql-server sql-server-2005 tsql 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

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

SELECT * FROM table1 t1
INNER JOIN table2 t2 on t1.id = tr.id
WHERE t2.desc LIKE 'A%'  -- notice no parameter here

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

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

任何想法可能导致操作员运行缓慢?

1 个答案:

答案 0 :(得分:4)

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

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