У меня довольно сложный запрос, который выглядит примерно так:
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)
Очевидно, это отключает параллелизм.
Итак, с 6222 строк результатов в cte3 я бы ожидал (6222 * 6221) / 2 или 19353531 результатов в последующем перекрестном соединении select и с окончательной строкой maxdop на месте, это действительно так.
Однако, когда я удаляю строку maxdop , количество результатов увеличивается до 19380454 . У меня 4 ядра на моей коробке разработчика.
WTF? Кто-нибудь может объяснить, почему это так? Нужно ли пересматривать предыдущие запросы, которые пересекаются, таким образом?