具有来自临时表的相同日期的不同执行计划

时间:2012-11-21 16:20:44

标签: tsql sql-server-2012 temp-tables

基本上,我有一个临时表,我使用不同的技术使用相同的数据填充表,以便在我的情况下找到最快的。这三种方法是:

  1. 使用连接选择插入的信息
  2. 选择插入信息的大部分地方 表/逻辑/计算包含在内联函数中
  3. 选择插入信息的大部分地方 表/逻辑/计算包含在表值函数
  4. 使用每个方法,表中都填充了相同的数据,并且使用表值函数可以获得最佳性能。但这里的事情很奇怪。

    填充临时表后,将对其执行简单的SELECT,并在所有列上使用GROUP BY和ORDER BY。因为数据是相同的,我预期相同的执行计划,但我明白了:

    enter image description here

    第一行是表值函数的执行计划,第二行是第一种和第二种方法的执行计划。

    为什么我对具有相同数据的表有两种不同的执行计划?为什么它不总是使用第一个,因为它比第二个快?

    注意,因为这与被排序和分组的数据相关联,我假设当我使用表值函数时,日期已经排序,但是简单的结果选择显示数据在同一个中排序在每种情况下的方式。

1 个答案:

答案 0 :(得分:0)

执行计划不仅仅是数据

查看Only In A Database Can You Get 1000% + Improvement By Changing A Few Lines Of Code

这样的事情不是SARGAble,而是会创建一个次优计划

where year(payment_dt) = year(getDate())
and month(payment_dt) = month(getDate())

优化器将为

创建最佳计划
where payment_dt >= dateadd(mm, datediff(mm, 0, getdate())+0, 0)
and payment_dt < dateadd(mm, datediff(mm, 0, getdate())+1, 0)

这两个将返回相同的行,一个将使用搜索,另一个将扫描,因为函数在列周围使用