2

我有一个相当复杂的查询,看起来像这样:

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个 不同的结果。在最后的select中,我在cte3上与其自身执行交叉连接(以便稍后我可以将表中的每个值与表中的每个其他值进行比较)。注意最后一行:

option (maxdop 1)

显然,这会关闭并行性。

因此,在cte3中有6222个结果行,我希望 (6222*6221)/2 或19353531在随后的交叉连接选择中产生结果,并且在最终的maxdop行到位的情况下,情况确实如此。

但是,当我删除maxdop行时,结果数会跳转到19380454。我的开发盒上有 4 个内核。

怎么回事?谁能解释这是为什么?我是否需要重新考虑以前以这种方式交叉连接的查询?

4

2 回答 2

0

除了错误之外,并行性不应影响结果。

于 2009-05-10T02:59:33.590 回答
0

看起来SCOPE_IDENTITY也有类似的平行错误

或者您是否也在使用snaphot isolation,另一个错误?还有一些博客展示了快照隔离在某些情况下被暂时关闭。

编辑:

回到快照隔离,这里的第 3 点:你应该对并行性感到紧张的六个原因

于 2009-05-10T09:25:22.287 回答