sql >> Databasteknik >  >> RDS >> Sqlserver

Varför är CTE (rekursiv) inte parallelliserad (MAXDOP=8)?

Jag skulle försöka skriva om CTE för att ta bort ett av stegen, dvs.

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

Om det bara finns ett rotelement skulle det vara bättre att skicka in detta i frågan som en variabel så att värdet kan användas av frågeoptimeraren.

En annan sak att försöka är att ändra frågan för att få rotelementen utan en underfråga, dvs. second_num är null eller first_num =second_num.



  1. Hur man tar bort hela MySQL-databasen

  2. Fel i MySQL Query (fel i din SQL-syntax)

  3. Hur man kontrollerar om en tjänst som jag inte vet namnet på körs på Ubuntu

  4. Hur får man data med>=OCH <=i ett 12 timmars tidsformat i php/mysql?