Sql server 2005 复杂查询的CTE查询计划-同一初始查询的三次运行-为什么?

Sql server 2005 复杂查询的CTE查询计划-同一初始查询的三次运行-为什么?,sql-server-2005,tsql,sql-execution-plan,Sql Server 2005,Tsql,Sql Execution Plan,这很难解释,但我会尽力的。 正如您在随附的查询计划图片上所看到的(这是下面描述的“一地所有”查询的查询计划),有3个几乎相同的“块”-我的问题是为什么?在我看来,当我使用“all-in-one”(见下文)查询时,“Init”块(相当重)将使用不同的过滤器运行三次,而不是假脱机并在以后重用 此查询执行时间约为45秒。 It查询可以以以下形式呈现: -- Complex "All in One place" Query WITH init as ( Init1 complex query he

这很难解释,但我会尽力的。

正如您在随附的查询计划图片上所看到的(这是下面描述的“一地所有”查询的查询计划),有3个几乎相同的“块”-我的问题是为什么?在我看来,当我使用“all-in-one”(见下文)查询时,“Init”块(相当重)将使用不同的过滤器运行三次,而不是假脱机并在以后重用

此查询执行时间约为45秒。 It查询可以以以下形式呈现:

-- Complex "All in One place" Query
WITH init as (
  Init1 complex query here  -- (10 sec to run) if executed alone
)
, step1 as ( select * from init .. joins... where ... etc ), 
step2 as ( select *, row_number() over(__condition__) as rn from step1 where _filter1_)
, step3 as ( select * from step2 where __filter2_), 
.... some more steps could be here ....
select * 
into target_table
from step_N;
-- 45sec CPU time 
这里重要的是,我在“WITH”子句中按顺序使用这些Step1、Step2、…、StepN表-Step1使用INIT表,因此Step2使用Step1表,Step3使用Step2表等。我需要这样做,因为我在以后用于过滤的每个步骤后处理不同的排名

如果将这个复杂的CTE查询更改为(我将Init查询的结果放入表中,然后不做任何更改地处理其他步骤):

我有大约15秒的执行时间,这对我来说还行。因为10sec是第一个很难改进的复杂查询


因此,我无法获得此MS Sql server 2005行为?谁能给我解释一下吗?我想这相当有趣

看起来优化器认为在不同条件下运行三次查询会更快。优化器并不总是正确的

实际上,使用临时表强制SQLServer首先执行整个复杂查询是非常常见的。通常,您会使用临时表而不是
test\u init

insert into #temptbl select * from Init

SQLServer还使用一个临时表来存储联接和子查询的结果。使用临时表不会对性能产生负面影响。

看起来优化器认为在不同条件下运行三次查询会更快。优化器并不总是正确的

实际上,使用临时表强制SQLServer首先执行整个复杂查询是非常常见的。通常,您会使用临时表而不是
test\u init

insert into #temptbl select * from Init

SQLServer还使用一个临时表来存储联接和子查询的结果。使用临时表不会对性能产生负面影响。

我们有时使用表用于以后的QA目的。适当时使用临时表。六羟甲基三聚氰胺六甲醚。。。有没有一种方法可以“告诉”MS SQL,最好将结果放在spool中并重用?写一个计划,提示,什么?@zmische-计划提示很有可能,但记住spool在tempdb中只是一个工作表。是的,你是对的。但是我要在一个查询中完成这项工作,而不需要额外的选择。。从。如果从MS SQL server的角度来看是相同的,则更是如此。%)反正是Thx!我们有时使用表格来进行QA。适当时使用临时表。六羟甲基三聚氰胺六甲醚。。。有没有一种方法可以“告诉”MS SQL,最好将结果放在spool中并重用?写一个计划,提示,什么?@zmische-计划提示很有可能,但记住spool在tempdb中只是一个工作表。是的,你是对的。但是我要在一个查询中完成这项工作,而不需要额外的选择。。从。如果从MS SQL server的角度来看是相同的,则更是如此。%)反正是Thx!