Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 并行性如何影响结果的数量?_Sql Server 2008_Common Table Expression_Parallel Processing - Fatal编程技术网

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)