为什么第一个sql查询的运行速度比第二个快得多?

为什么第一个sql查询的运行速度比第二个快得多?,sql,sql-server,date,Sql,Sql Server,Date,我有两个查询,一个运行得非常快(大约1秒),另一个执行起来大约需要8秒。唯一的区别是,我创建了sql变量来保存慢速查询中的开始日期和结束日期,而在快速查询中,开始日期和结束日期是动态转换的 我会在excel报告中使用快速查询,但随着报告每天运行,日期值每天都会更改,因此需要对其进行参数化,因此需要进行第二次查询。我想解释一下为什么这两个查询的执行时间如此不同 两个查询返回的行数相同。在Channel和Date_Date列上有一个非聚集索引,在表的ID列上有一个聚集索引。提前感谢您提供的任何帮助

我有两个查询,一个运行得非常快(大约1秒),另一个执行起来大约需要8秒。唯一的区别是,我创建了sql变量来保存慢速查询中的开始日期和结束日期,而在快速查询中,开始日期和结束日期是动态转换的

我会在excel报告中使用快速查询,但随着报告每天运行,日期值每天都会更改,因此需要对其进行参数化,因此需要进行第二次查询。我想解释一下为什么这两个查询的执行时间如此不同

两个查询返回的行数相同。在Channel和Date_Date列上有一个非聚集索引,在表的ID列上有一个聚集索引。提前感谢您提供的任何帮助

慢速查询(8秒)

快速查询(1秒)

我希望第一个查询至少和第二个查询一样快,但执行起来需要8秒,而第二个查询需要1秒

这些是执行计划,慢速查询位于顶部


您能与我们分享执行计划吗?您可以使用SentryOne或从SentryOne生成实际执行计划,然后(通过单击计划资源管理器中的按钮)将其上载到SQLPerformance。为什么您要对日期使用
varchar(8)
,而不是
date
Date\u YYYYMMDD
包含什么内容?日期没有格式,它们是二进制值。如果
Date\u yyyyymmdd
是一个字符串字段,则会出现一个严重的错误。如果不在AND子句中转换日期,将变量声明为日期并避免所有转换,则可能会节省一些时间。不,预转换日期变量也需要8秒。-看起来您可能需要转换为存储过程…能否与我们共享执行计划?您可以使用SentryOne或从SentryOne生成实际执行计划,然后(通过单击计划资源管理器中的按钮)将其上载到SQLPerformance。为什么您要对日期使用
varchar(8)
,而不是
date
Date\u YYYYMMDD
包含什么内容?日期没有格式,它们是二进制值。如果
Date\u yyyyymmdd
是一个字符串字段,则会出现一个严重的错误。如果不在AND子句中转换日期,将变量声明为日期并避免所有转换,则可能会节省一些时间。不,预转换日期变量也需要8秒。-看起来您可能需要转换为存储过程。。。
declare @startdateStr varchar(8)
declare @enddateStr varchar(8)

select @startdateStr = '20190824'
select @enddateStr = '20190830'

SELECT Date_YYYYMMDD, -- varchar(50) date in YYYYMMDD format 
    Date_Date, -- datetime
    Week_Number, -- int
    Sum(intcol1) AS SumOfIntCol1,
    Sum(intcol2) AS SumOfIntCol2,
    Business_Area
FROM dbo.Table
WHERE [Channel]='ChannelName'
AND convert(date, Date_Date) Between convert(date, @startdateStr)
    And convert(date, @enddateStr)
GROUP BY Date_Date,
    Date_YYYYMMDD,
    Week_Number,
    Business_Area
ORDER BY Date_YYYYMMDD;
SELECT Date_YYYYMMDD, -- varchar(50) date in YYYYMMDD format 
    Date_Date, -- datetime
    Week_Number, -- int
    Sum(intcol1) AS SumOfIntCol1,
    Sum(intcol2) AS SumOfIntCol2,
    Business_Area
FROM dbo.Table
WHERE [Channel]='ChannelName'
AND convert(date, Date_Date) Between convert(date, '20190824') 
    And convert(date, '20190830')
GROUP BY Date_Date,
    Date_YYYYMMDD,
    Week_Number,
    Business_Area
ORDER BY Date_YYYYMMDD;