Es ist ziemlich gut dokumentiert, dass skalare UDFs einen allgemeinen Serienplan erzwingen.
Warum kann die Engine angesichts einer großen Anzahl von Zeilen, die an einen Punkt in der Pipeline gelangen, an dem eine UDF berechnet werden muss, diese nicht einfach auf die Prozessoren verteilen? Wenn es innerhalb einer UDF keinen Status gibt, sollte die Reihenfolge keine Rolle spielen.
Es gibt Behauptungen, dass UDFs als Blackbox den Cursor verwenden müssen. Ich kann sehen, dass ein Benutzercursor innerhalb eines SP nicht parallelisiert werden kann, wenn zwischen den Iterationen ein bestimmter Status beibehalten wird, der ansonsten jedoch parallelisierbar sein sollte.
Zusätzliche Punkte zur Erklärung, warum der Motor den gesamten Plan als seriell erzwingt, anstatt nur die UDF-Berechnungsstufe.
Ist die Unterstützung von paralleler UDF eine sinnvolle Funktion?
quelle
Antworten:
Ich bin mir nicht sicher, ob das alles so gut dokumentiert ist.
Siehe Erzwingen eines parallelen Ausführungsplans und / oder Craig Freedmans Präsentation zur parallelen Ausführung .
Diese Behauptungen sind nicht korrekt.
Nach meinem Verständnis sind die aktuellen Einschränkungen lediglich das Ergebnis bestimmter Implementierungsdetails. Es gibt keinen fundamentalen Grund, warum Funktionen nicht parallel ausgeführt werden könnten.
Insbesondere werden T-SQL-Skalarfunktionen in einem separaten T-SQL-Kontext ausgeführt, was den korrekten Betrieb, die Koordination und das Herunterfahren (insbesondere im Fehlerfall) erheblich erschwert.
Ebenso unterstützen Tabellenvariablen im Allgemeinen parallele Lesevorgänge (aber keine Schreibvorgänge), aber die Tabellenvariable, die von einer Tabellenwertfunktion verfügbar gemacht wird, kann aus implementierungsspezifischen Gründen keine parallelen Lesevorgänge unterstützen. Ich fürchte, Sie benötigen jemanden mit Quellcode-Zugriff (und der Freiheit, Details auszutauschen), um eine maßgebliche Antwort zu geben.
Natürlich, wenn Sie stark genug argumentieren können. Mein eigenes Gefühl ist, dass die damit verbundene Arbeit umfangreich wäre, sodass Ihr Vorschlag eine extrem hohe Messlatte erreichen müsste . Zum Beispiel hat eine verwandte (und viel einfachere) Anforderung , Inline-Skalarfunktionen bereitzustellen, große Unterstützung, ist jedoch seit Jahren nicht mehr implementiert.
Vielleicht möchten Sie das Microsoft-Papier lesen:
... beschreibt den Ansatz, den Microsoft bei der Behebung von Leistungsproblemen mit T-SQL-Skalarfunktionen in der Version nach SQL Server 2017 verfolgen möchte.
(Hervorhebung von mir)
Inline-skalare T-SQL-Funktionen sind jetzt in SQL Server 2019 implementiert .
quelle
Wie Paulus in seiner Antwort zu Recht erwähnt hat, gibt es keinen fundamentalen Grund, warum skalare UDFs nicht mit Parallelität ausgeführt werden könnten. Abgesehen von den Implementierungsproblemen gibt es jedoch noch einen weiteren Grund, sie zur Serialisierung zu zwingen. Das von Paul zitierte Froid- Papier enthält weitere Informationen dazu.
Zitat aus dem Papier (Abschnitt 2.3):
Der in diesem Artikel beschriebene Ansatz von Froid führt nicht nur zu parallelen Plänen, sondern bietet auch viele weitere Vorteile für Abfragen mit UDFs. Im Wesentlichen wird Ihre Anforderung zur parallelen Ausführung von UDFs zusammengefasst.
[Offenlegung: Ich bin Mitautor des Froid-Papiers]
quelle