Sql server 为什么WHERE子句中的硬编码日期比参数中的相同日期具有更快的性能?

Sql server 为什么WHERE子句中的硬编码日期比参数中的相同日期具有更快的性能?,sql-server,performance,tsql,database-administration,Sql Server,Performance,Tsql,Database Administration,如果我将日期放在WHERE子句的第一个查询中,或者将相同的日期放在第二个查询中,为什么性能会有如此巨大的差异 --------/* Execution time 3 sec*/ select tblNoteDiaries.DueDate, col2, col3 from MyTable where CAST(tblNoteDiaries.DueDate as date) <= cast(ge

如果我将日期放在WHERE子句的第一个查询中,或者将相同的日期放在第二个查询中,为什么性能会有如此巨大的差异

--------/* Execution time 3 sec*/ 
   select 
            tblNoteDiaries.DueDate,
            col2,
            col3
    from MyTable 
    where CAST(tblNoteDiaries.DueDate as date) <= cast(getdate()as date) and cast( tblNoteDiaries.DueDate as date) >= CAST('2017-09-29' as DATE)

--------/* Execution time 10 sec*/    
    declare     @DateFrom datetime = '2017-09-29',
                @DateTo datetime = '2017-10-05'
    select 
            tblNoteDiaries.DueDate,
            col2,
            col3
    from    MyTable 
    where   CAST(tblNoteDiaries.DueDate as date)  >= @DateFrom   and cast( tblNoteDiaries.DueDate as date) <= @DateTo 

我需要将此查询作为存储过程,在不降低性能的情况下利用日期参数的最佳方法是什么???

,因为您的变量被声明为datetime。这具有更高的数据类型优先级。因此,您将DueDate列显式转换为date,然后再次转换为datetime


使用日期作为变量,您应该会看到相同的性能。更好的是,如果类型已经正确,不要强制转换日期列

因为变量被声明为datetime。这具有更高的数据类型优先级。因此,您将DueDate列显式转换为date,然后再次转换为datetime


使用日期作为变量,您应该会看到相同的性能。更好的是,如果类型已经正确,不要强制转换日期列

我使用下面的查询在我的数据库上模拟

select sum(PrinBal)
from fpc
where SnapshotDt >= '2017-06-01' and SnapshotDt <= '2017-06-30'
go

declare @sd date = '2017-06-01'
declare @ed date = '2017-06-30'
select sum(PrinBal)
from fpc
where SnapshotDt >= @sd and SnapshotDt <= @ed
go
正如尼克所说,这是参数嗅探


您可以使用更新的统计信息或对查询和存储过程使用重新编译选项来摆脱参数嗅探

select sum(PrinBal)
from fpc
where SnapshotDt >= '2017-06-01' and SnapshotDt <= '2017-06-30'
go

declare @sd date = '2017-06-01'
declare @ed date = '2017-06-30'
select sum(PrinBal)
from fpc
where SnapshotDt >= @sd and SnapshotDt <= @ed
go
正如尼克所说,这是参数嗅探


您可以使用更新的统计信息或对查询和存储过程使用“重新编译”选项来摆脱参数嗅探。

您看到执行计划中有什么不同吗?最有可能的是参数嗅探。执行计划会给你一个线索。你看到执行计划有什么不同吗?很可能是参数嗅探。执行计划会给你一个线索。我测试了日期和日期时间类型,但没有看到任何区别。我测试了日期和日期时间类型,但没有看到任何区别。