Sql server SQL Server存储过程参数会影响查询速度-为什么?
我正在SQLServer2005上运行一个存储过程,并从VB.net应用程序调用它 这个存储过程的运行时间超过了3分钟,我开始加快它的运行速度。我偶然发现了一个解决方案,将运行时间从3分钟缩短到3秒(不是开玩笑,我是认真的) 但我不明白为什么 我传递的仅有两个参数是开始日期和结束日期(在Sql server SQL Server存储过程参数会影响查询速度-为什么?,sql-server,vb.net,Sql Server,Vb.net,我正在SQLServer2005上运行一个存储过程,并从VB.net应用程序调用它 这个存储过程的运行时间超过了3分钟,我开始加快它的运行速度。我偶然发现了一个解决方案,将运行时间从3分钟缩短到3秒(不是开玩笑,我是认真的) 但我不明白为什么 我传递的仅有两个参数是开始日期和结束日期(在WHERE子句中使用),如下所示: 尽管经过一些测试,我发现当我在存储过程中硬编码日期时,运行时间从3分钟缩短到了3秒 我的结局是: ALTER PROCEDURE get_OrderLinessByRegion
WHERE
子句中使用),如下所示:
尽管经过一些测试,我发现当我在存储过程中硬编码日期时,运行时间从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
谁能告诉我为什么第二个版本运行得这么快
非常感谢 这听起来像是错误的参数嗅探。您可以阅读本文以获得详细的解释 这是一个糟糕的参数嗅探案例。嗯,我以前从未听说过参数嗅探,所以我在谷歌上找到了这篇文章:。当参数被定义为DATETIME时,为什么会发生参数嗅探?对于该数据类型,执行计划似乎必须始终相同?是的,这是关于该主题的另一篇好文章。这不是关于数据类型的,请再次阅读该文章。这是一个基于特定值的编译执行计划,第一个“Duh…”是我没有注意到你提供了一个链接。第二个“Duh…”是我现在更好地理解了价值观的概念。现在,我如何给你答案?
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