我在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
有谁能告诉我为什么第二个版本运行得那么快?
非常感谢!!
答案 0 :(得分:1)
这听起来像是参数嗅探不好的情况。您可以阅读本文以获得详细说明。 http://sqlinthewild.co.za/index.php/2007/11/27/parameter-sniffing/