Jest dość dobrze udokumentowane, że skalarne UDF wymuszają ogólny plan szeregowy.
Uruchamianie funkcji równolegle
Biorąc pod uwagę dużą liczbę wierszy wchodzących w punkt w rurociągu, w którym należy obliczyć współczynnik UDF, dlaczego silnik nie może po prostu rozdzielić ich między procesory? Jeśli nie ma stanu w UDF, kolejność nie powinna mieć znaczenia.
Istnieją twierdzenia, że UDF jest czarne pudełko musi używać kursora. Widzę, że kursor użytkownika nie może być zrównoleglony w SP dla przypadków, w których pewien stan jest utrzymywany między iteracjami, ale wydaje się, że w przeciwnym razie powinien być równoległy.
Dodatkowe punkty za wyjaśnienie, dlaczego silnik wymusza szeregowanie całego planu zamiast samego etapu obliczeń UDF.
Czy wsparcie dla równoległego UDF jest rozsądną funkcją, o którą można poprosić?
źródło
Odpowiedzi:
Nie jestem pewien, czy to wszystko jest tak dobrze udokumentowane.
Zobacz Wymuszanie planu równoległego wykonywania i / lub prezentację równoległego wykonywania Craiga Freedmana .
Twierdzenia te są nieprawidłowe.
Rozumiem, że obecne ograniczenia są wyłącznie wynikiem pewnych szczegółów implementacyjnych. Nie ma podstawowego powodu, dla którego funkcje nie mogłyby być wykonywane przy użyciu równoległości.
W szczególności funkcje skalarne T-SQL wykonują się w osobnym kontekście T-SQL, co znacznie komplikuje prawidłowe działanie, koordynację i zamknięcie (szczególnie w przypadku błędu).
Podobnie, zmienne tabelowe ogólnie obsługują odczyty równoległe (ale nie zapisują), ale zmienna tabelowa ujawniona przez funkcję wycenioną w tabeli nie jest w stanie obsługiwać odczytów równoległych z powodów specyficznych dla implementacji. Obawiam się, że potrzebujesz kogoś z dostępem do kodu źródłowego (i swobodą udostępniania szczegółów), aby udzielić wiarygodnej odpowiedzi.
Oczywiście, jeśli potrafisz zrobić wystarczająco mocną skrzynkę. Uważam, że zaangażowana praca byłaby obszerna, więc twoja propozycja musiałaby spełnić bardzo wysoki poziom. Na przykład powiązane (i znacznie prostsze) żądanie dostarczenia wbudowanych funkcji skalarnych ma świetne wsparcie, ale od lat nie funkcjonuje.
Może chcesz przeczytać artykuł Microsoft:
... który przedstawia podejście, jakie Microsoft zamierza zastosować w celu rozwiązania problemów z wydajnością funkcji skalarnej T-SQL w wydaniu po SQL Server 2017.
(moje podkreślenie)
Wbudowane funkcje skalarne T-SQL są teraz zaimplementowane w SQL Server 2019 .
źródło
Jak słusznie wspomniał Paul w swojej odpowiedzi, nie ma podstawowego powodu, dla którego skalarne UDF nie mogą być wykonywane przy użyciu równoległości. Jednak oprócz wyzwań związanych z implementacją istnieje jeszcze jeden powód, aby wymusić ich szeregowość. Artykuł Froida cytowany przez Paula daje więcej informacji na ten temat.
Cytowanie z pracy (sekcja 2.3):
Podejście Froid, jak opisano w artykule, przyniesie nie tylko równoległe plany, ale także doda wiele innych korzyści dla zapytań z UDF. W gruncie rzeczy obejmuje twoje żądanie równoległego wykonywania UDF.
[Ujawnienie: Jestem współautorem artykułu Froid]
źródło