Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum ist CTE (rekursiv) nicht parallelisiert (MAXDOP=8)?

Ich würde versuchen, den CTE umzuschreiben, um einen der Schritte zu entfernen, dh

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

Wenn es nur ein Wurzelelement gibt, wäre es besser, dieses als Variable an die Abfrage zu übergeben, damit der Wert vom Abfrageoptimierer verwendet werden kann.

Sie können auch versuchen, die Abfrage so zu ändern, dass die Stammelemente ohne Unterabfrage abgerufen werden, d. h. second_num ist null oder first_num =second_num.