У нас довольно большая машина с памятью 100 ГБ и 8+ ядрами.Серверный MAXDOP = 8.
T_SEQ_FF rowcount = 61692209, size = 2991152 KB
UPD 1: Таблица T_SEQ_FF
имеет два индекса:
1) create index idx_1 on T_SEQ_FF (first_num)
2) create index idx_2 on T_SEQ_FF (second_num)
Таблица T_SEQ_FF
имеет first_num
,second_num pairs
чисел, которые должны обеспечивать последовательность после cte:
;with first_entity as (
select first_num from T_SEQ_FF a where not exists (select 1 from T_SEQ_FF b where a.first_num = b.second_num)
) ,
cte as (
select a.first_num, a.second_num, a.first_num as first_key, 1 as sequence_count
from T_SEQ_FF a inner join first_entity b on a.first_num = b.first_num
union all
select a.first_num, a.second_num, cte.first_key, cte.sequence_count + 1
from T_SEQ_FF a
inner join cte on a.first_num = cte.second_num
)
select *
from cte
option (maxrecursion 0);
Но когда я запускаю этот запрос - я вижу только план последовательного запроса без параллелизма.Если бы я удалил 2-ю часть CTE из запроса выше:
union all
select a.first_num, a.second_num, cte.first_key, cte.sequence_count + 1
from T_SEQ_FF a
inner join cte on a.first_num = cte.second_num
, то я мог бы видеть, что план запроса становится Распараллеленным с использованием Repartition и Gather Streams.
Итак, я могу подвести итог, что это из-за recurisve CTE SQL Server не использует параллелизм при обработке этого запроса.
Я считаю, что на такой большой машине с тоннами свободных ресурсов параллелизм должен помочь быстрее завершить запрос.
Пока он работает около 40-50 минут.
Не могли бы вы посоветовать, как использовать столько ресурсов, сколько мы можем, чтобы завершить запрос быстрее?
CTE - единственный вариант, потому что нам нужно заполнить последовательности из пар first_num - second_num
, и эти последовательности могутбыть любой длины.