Как параллелизм может повлиять на количество результатов? - PullRequest
2 голосов
/ 10 мая 2009

У меня довольно сложный запрос, который выглядит примерно так:

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? Кто-нибудь может объяснить, почему это так? Нужно ли пересматривать предыдущие запросы, которые пересекаются, таким образом?

Ответы [ 2 ]

0 голосов
/ 10 мая 2009

Похоже, что есть похожая ошибка парализма с SCOPE_IDENTITY тоже

Или вы используете изоляция снимка , тоже ошибка? Есть также некоторые блоги, которые демонстрируют временное отключение изоляции снимков при определенных условиях.

Edit:

Возвращаясь к изоляции моментального снимка, номер 3 здесь: Шесть причин, по которым вы должны волноваться о параллелизме

0 голосов
/ 10 мая 2009

Помимо ошибки, параллелизм не должен влиять на результат.

...