Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Perché CTE (ricorsivo) non è parallelizzato (MAXDOP=8)?

Proverei a riscrivere il CTE per rimuovere uno dei passaggi, ad es.

;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);

Se è presente un solo elemento radice, sarebbe meglio passarlo nella query come variabile in modo che il valore possa essere utilizzato da Query Optimizer.

Un'altra cosa da provare è modificare la query per ottenere gli elementi radice senza una sottoquery, ad esempio second_num è null o first_num =second_num.