Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi CTE (récursif) n'est pas parallélisé (MAXDOP=8) ?

J'essaierais de réécrire le CTE pour supprimer l'une des étapes, c'est-à-dire

;cte as ( 
select a.first_num, a.second_num, a.first_num as first_key, 1 as sequence_count 
from  T_SEQ_FF a  where not exists (select 1 from  T_SEQ_FF b  where a.first_num = b.second_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);

S'il n'y a qu'un seul élément racine, il serait préférable de le transmettre à la requête en tant que variable afin que la valeur puisse être utilisée par l'optimiseur de requête.

Une autre chose à essayer est de modifier la requête pour obtenir les éléments racine sans sous-requête, c'est-à-dire que second_num est nul ou first_num =second_num.