SQL Query处理日期参数的方式不同

Mat*_*att 5 sql t-sql sql-server sql-server-2008

所以我们有一个简单的查询,它运行时连接到几个表,我们约会这个数据.这些查询构成了我们数据仓库负载的一部分,对时间至关重要.当我们使用where子句中的日期更改为连接到日期为的临时表时,我们注意到执行速度和执行计划存在巨大差异.所以:

    Declare @StartDate DateTime = Cast(Floor(Cast(GetDate() AS FLOAT))AS DateTime)
    Declare @EndDate DateTime = GetDate()

    Select *
    From Table A 
           Inner Join Table B
                On A.A = B.A
    Where A.Date Between @StartDate AND @EndDate
Run Code Online (Sandbox Code Playgroud)

查询的简化版本,但在大约50秒内返回11k行.

    Declare @StartDate DateTime = Cast(Floor(Cast(GetDate() AS FLOAT))AS DateTime)
    Declare @EndDate DateTime = GetDate()

    Select @StartDate StartDate, @EndDate EndDate
    Into #Dates

    Select *
    From Table A 
           Inner Join Table B
                On A.A = B.A
           Inner Join #Dates
                On A.Date Between StartDate AND EndDate
Run Code Online (Sandbox Code Playgroud)

返回相同的11k行但是亚秒.执行计划的差异也很明显,第二个查询充满了嵌套循环,而不是第一个查询中的散列匹配.

我的问题是为什么?为什么50左右的差异?

/*编辑*/

两个QEP的

第一个查询,其中包含日期

第二个查询,包含加入日期

小智 0

我认为这是在 WHERE 子句中使用函数的问题。这里描述的问题