Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dlaczego CTE (rekurencyjne) nie jest zrównoleglone (MAXDOP=8)?

Spróbowałbym przepisać CTE, aby usunąć jeden z kroków, 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);

Jeśli istnieje tylko jeden element główny, lepiej byłoby przekazać go do zapytania jako zmienną, aby wartość mogła być użyta przez optymalizator zapytania.

Inną rzeczą do wypróbowania jest zmiana zapytania, aby uzyskać elementy główne bez podzapytania, tj. second_num jest null lub first_num =second_num.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przekaż identyfikator najemcy przez połączenie z serwerem sql

  2. Usługi raportowania MS ograniczające liczbę wierszy

  3. Insert Statement + Łączenie danych tabeli i zmiennej w wyzwalaczu

  4. Jak mogę powiadomić mój program o aktualizacji bazy danych?

  5. Jak znaleźć domyślne ograniczenie przy użyciu INFORMATION_SCHEMA?