Es ist ziemlich gut dokumentiert, dass UDFs einen seriellen Gesamtplan erzwingen.
Ich bin mir nicht sicher, ob das alles so gut dokumentiert ist.
- Eine skalare T-SQL-Funktion verhindert Parallelität an einer beliebigen Stelle im Plan.
- Eine skalare CLR-Funktion kann parallel ausgeführt werden, solange sie nicht auf die Datenbank zugreift.
- Eine T-SQL-Funktion mit mehreren Anweisungen und Tabellen erzwingt eine serielle Zone in einem Plan, die möglicherweise an anderer Stelle Parallelität verwendet.
- Eine Inline-T-SQL-Funktion mit Tabellenwert wird wie eine Ansicht erweitert und hat daher keine direkten Auswirkungen.
Siehe Erzwingen eines parallelen Ausführungsplans und / oder Craig Freedmans Präsentation zur parallelen Ausführung .
Es gibt Behauptungen, dass UDFs als Blackbox den Cursor verwenden müssen.
Diese Behauptungen sind nicht korrekt.
Zusätzliche Punkte zur Erklärung, warum der Motor den gesamten Plan als seriell erzwingt, anstatt nur die UDF-Berechnungsstufe.
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.
Ist die Unterstützung von paralleler UDF eine sinnvolle Funktion?
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.
Das Ziel von Froid ist es, Entwicklern die Verwendung der Abstraktionen von UDFs und Prozeduren zu ermöglichen, ohne die Leistung zu beeinträchtigen. Froid erreicht dieses Ziel mithilfe einer neuartigen Technik, um imperative Programme nach Möglichkeit automatisch in äquivalente relationale algebraische Formen umzuwandeln. Froid modelliert Blöcke imperativen Codes als relationale Ausdrücke und kombiniert sie mithilfe des Apply-Operators systematisch zu einem einzigen Ausdruck. Dadurch kann der Abfrageoptimierer effiziente satzorientierte parallele Abfragepläne auswählen .
(Hervorhebung von mir)
Inline-skalare T-SQL-Funktionen sind jetzt in SQL Server 2019 implementiert .