我有一个相当复杂的查询,看起来像这样:
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 个内核。
怎么回事?谁能解释这是为什么?我是否需要重新考虑以前以这种方式交叉连接的查询?