Tsql 临时表中日期相同的不同执行计划

Tsql 临时表中日期相同的不同执行计划,tsql,sql-server-2012,temp-tables,Tsql,Sql Server 2012,Temp Tables,基本上,我有一个临时表,我使用不同的技术用相同的数据填充该表,以便在我的例子中找到最快的一个。这三种方法是: 选择使用联接插入的信息 选择插入的信息,其中大多数 表/逻辑/计算包含在内联函数中 选择插入的信息,其中大多数 表/逻辑/计算包含在表值函数中 每种方法都使用相同的数据填充表,我使用表值函数获得最佳性能。但这里的情况很奇怪 填充临时表后,将对其执行简单的选择,并在所有列上显示GROUP BY和ORDER BY。因为数据是相同的,所以我期望有相同的执行计划,但我得到以下结果: 其中第一行

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

  • 选择使用联接插入的信息
  • 选择插入的信息,其中大多数 表/逻辑/计算包含在内联函数中
  • 选择插入的信息,其中大多数 表/逻辑/计算包含在表值函数中
  • 每种方法都使用相同的数据填充表,我使用表值函数获得最佳性能。但这里的情况很奇怪

    填充临时表后,将对其执行简单的选择,并在所有列上显示GROUP BY和ORDER BY。因为数据是相同的,所以我期望有相同的执行计划,但我得到以下结果:

    其中第一行是表值函数的执行计划,第二行是第一个和第二个方法的执行计划

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


    注意,由于这与排序和分组依据的数据有关,因此我假设当我使用表值函数时,可能日期已经排序,但简单地选择结果显示,在每种情况下,数据的排序方式都是相同的。

    执行计划不仅仅是数据

    看看

    类似的东西不是可搜索的,将创建一个次优计划

    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)
    
    其中payment\u dt>=dateadd(mm,datediff(mm,0,getdate())+0,0)
    和付款_dt

    这两个将返回相同的行,一个将使用seek,另一个将使用scan,因为函数是围绕列使用的

    哇,在查询优化器出现之前的几天,您应该已经出现过了。查询优化器只能在查询结构中运行。你今天仍然可以做提示。join、exists和intersect都可以是具有不同查询计划的等效查询。在这种情况下,我将重点介绍最后一个SELECT,其目的是使用ORDER BY和GROUP BY子句显示临时表中的所有记录。因为我有同样的信息,我期待着同样的计划。我不是在比较我使用不同方法的陈述的第一部分,所以不清楚。您的问题是关于一个您甚至没有发布的select语句?我怀疑用group by和order by子句显示普通select语句是否非常有用?