Sql server 2008 并行性如何影响结果的数量?
我有一个相当复杂的查询,如下所示:Sql server 2008 并行性如何影响结果的数量?,sql-server-2008,common-table-expression,parallel-processing,Sql Server 2008,Common Table Expression,Parallel Processing,我有一个相当复杂的查询,如下所示: create table Items(SomeOtherTableID int,SomeField int) create table SomeOtherTable(Id int,GroupID int) with cte1 as ( select SomeOtherTableID,COUNT(*) SubItemCount from Items t where t.SomeFi
create table Items(SomeOtherTableID int,SomeField int)
create table SomeOtherTable(Id int,GroupID int)
with cte1 as
(
select
SomeOtherTableID,COUNT(*) SubItemCount
from
Items t
where
t.SomeField is not null
group by
SomeOtherTableID
),cte2 as
(
select
tc.SomeOtherTableID,ROW_NUMBER() over (partition by a.GroupID order by tc.SubItemCount desc) SubItemRank
from
Items t
inner join SomeOtherTable a on a.Id=t.SomeOtherTableID
inner join cte1 tc on tc.SomeOtherTableID=t.SomeOtherTableID
where
t.SomeField is not null
),cte3 as
(
select
SomeOtherTableID
from
cte2
where
SubItemRank=1
)
select
*
from
cte3 t1
inner join cte3 t2 on t1.SomeOtherTableID<t2.SomeOtherTableID
option (maxdop 1)
显然,这关闭了并行性
因此,对于cte3中的6222结果行,我预计(6222*6221)/2,或19353531将在随后的交叉连接选择中产生结果,并且最终的maxdop行已就位,情况确实如此
但是,当我删除maxdop行时,结果数跳到19380454。我的开发盒上有4个内核
WTF?有人能解释为什么会这样吗?我需要重新考虑以前以这种方式交叉连接的查询吗?除了一个错误,并行性不应该影响结果。除了一个错误,并行性不应该影响结果。看起来也有一个类似的平行错误 或者你正在使用另一个bug?还有一些博客演示了快照隔离在某些情况下被暂时关闭 编辑:
回到快照隔离,这里的第3点:看起来也有一个类似的parallism错误 或者你正在使用另一个bug?还有一些博客演示了快照隔离在某些情况下被暂时关闭 编辑:
回到快照隔离,这里的第3条:您是否查看了集合差异,以查看集合2中哪些行不在集合1中?集合1,集合2?你是说cte1和cte2吗?如果是这样的话,最后的连接只在cte3上,它有一个单独的结果字段(我已经检查过),所以cte1和cte2中发生的事情应该无关紧要,对吧?不,对不起,我的意思是结果集。如果得到两个不同的结果,我想知道当关闭maxdop时,结果中有哪些额外的行。它可能会给你一个关于发生了什么的线索。内存中有1900万个结果有点棘手,因为我没有足够的内存来存储这两个结果集。当然,将cte3插入到声明的表中并使用第二个表可以像预期的那样工作。是否每次都可以在有MAXDOP和没有MAXDOP的情况下一致地复制它?那么MAXDOP 2呢?您是否查看了集合差异以查看集合2中哪些行不在集合1中?集合1,集合2?你是说cte1和cte2吗?如果是这样的话,最后的连接只在cte3上,它有一个单独的结果字段(我已经检查过),所以cte1和cte2中发生的事情应该无关紧要,对吧?不,对不起,我的意思是结果集。如果得到两个不同的结果,我想知道当关闭maxdop时,结果中有哪些额外的行。它可能会给你一个关于发生了什么的线索。内存中有1900万个结果有点棘手,因为我没有足够的内存来存储这两个结果集。当然,将cte3插入到声明的表中并使用第二个表可以像预期的那样工作。是否每次都可以在有MAXDOP和没有MAXDOP的情况下一致地复制它?MAXDOP 2呢?
option (maxdop 1)