【问题标题】:Different Execution Plans with same date from temp table临时表中具有相同日期的不同执行计划
【发布时间】:2012-11-09 22:56:15
【问题描述】:

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

  1. 使用连接选择插入的信息
  2. 选择插入的信息,其中大部分 表格/逻辑/计算包含在内联函数中
  3. 选择插入的信息,其中大部分 表/逻辑/计算包含在表值函数中

使用每种方法,表格都填充了相同的数据,我使用表格值函数获得了最佳性能。但是这里的事情变得奇怪了。

在填充临时表后,对其进行简单的 SELECT 操作,并在所有列上使用 GROUP BY 和 ORDER BY。因为数据是相同的,所以我期望相同的执行计划,但我得到了这个:

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

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

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

【问题讨论】:

  • 哇,您应该早在查询优化器之前就已经存在了。查询优化器只能在查询结构内运行。你今天仍然可以做提示。 join、exists 和 intersect 都可以是等效的查询,它们通常具有不同的查询计划。
  • 在这种情况下,我专注于最后一个 SELECT,其目的是使用 ORDER BY 和 GROUP BY 子句显示临时表中的所有记录。由于我有相同的信息,我期待相同的计划。我不是在比较我使用不同方法的陈述的第一部分。
  • 不清楚。您的问题是关于您甚至没有发布的选择声明?
  • 我怀疑用 group by 和 order by 子句显示一个普通的选择会非常有用吗?

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


【解决方案1】:

执行计划不仅仅是数据

看看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)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-10
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多