Zkusil bych přepsat CTE, abych odstranil jeden z kroků, tj.
;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);
Pokud existuje pouze jeden kořenový prvek, bylo by lepší předat jej do dotazu jako proměnnou, aby hodnotu mohl použít optimalizátor dotazů.
Další věc, kterou můžete zkusit, je změnit dotaz tak, aby získal kořenové prvky bez poddotazu, tj. second_num je null nebo first_num =second_num.