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.