代码之家  ›  专栏  ›  技术社区  ›  rs.

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

  •  6
  • rs.  · 技术社区  · 15 年前

    样本查询:

    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
    

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

    我的表2有140K条记录,表1大约250K条

    知道什么会导致像操作员一样的运行缓慢吗?

    1 回复  |  直到 15 年前
        1
  •  4
  •   Martin Smith    15 年前

    它在编译时不知道 @param 不会有前导通配符,因此当它编译批处理时,会给您一个计划,其中包含扫描而不是查找。

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