SQL Server存储过程参数会影响查询速度 - 为什么?

时间:2015-07-13 16:45:01

标签: sql-server vb.net

我在SQL Server 2005上运行存储过程并从VB.net应用程序调用它。

此存储过程需要3分钟才能运行,我开始着手加快速度。很偶然,我偶然发现了一个解决方案,将运行时间从3分钟减少到3秒(不开玩笑,我已经死了很严重)。

但我不明白为什么。

我传递的唯一两个参数是开始日期和结束日期(在WHERE子句中使用),如下所示:

ALTER PROCEDURE get_OrderLinessByRegion
     @DateFrom DATETIME,
     @DateTo DATETIME
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
 blah, blah, blah

虽然进行了一些测试,但我发现当我对存储过程中的日期进行硬编码时,运行时间从3分钟缩短到3秒。

我最终得到了这个:

ALTER PROCEDURE get_OrderLinessByRegion
  @DateFrom DATETIME,
  @DateTo DATETIME
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

       DECLARE @StartDate AS DATETIME
       DECLARE @EndDate AS DATETIME

       SET @StartDate = @DateFrom
       SET @EndDate = @DateTo
       blah, blah, blah

有谁能告诉我为什么第二个版本运行得那么快?

非常感谢!!

1 个答案:

答案 0 :(得分:1)

这听起来像是参数嗅探不好的情况。您可以阅读本文以获得详细说明。 http://sqlinthewild.co.za/index.php/2007/11/27/parameter-sniffing/