所以我们有一个简单的查询,它运行时连接到几个表,我们约会这个数据。这些查询构成了我们数据仓库负载的一部分,对时间至关重要。当我们使用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
查询的简化版本,但在大约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
返回相同的11k行但是亚秒。执行计划的差异也很明显,第二个查询充满了嵌套循环,而不是第一个查询中的散列匹配。
我的问题是为什么?为什么50左右的差异?
/ *编辑* /
两个QEP的