sql >> Databáze >  >> RDS >> Sqlserver

Proč CTE (rekurzivní) není paralelizováno (MAXDOP=8)?

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.



  1. Jak přidávat a měnit XML tagy v PHP

  2. 5 Výhody proaktivního monitorování výkonu databáze

  3. SQL Server:ekvivalent kaskády drop tabulky?

  4. Jak zastavit mysqld