Nein , es gibt keine Dokumentation von Microsoft, die das Verhalten garantiert . Daher wird keine Garantie übernommen .
Vorausgesetzt, der Simple Talk-Artikel ist korrekt und der physische Operator Verkettung verarbeitet Eingaben immer in der Reihenfolge, die im Plan angegeben ist (sehr wahrscheinlich ist dies der Fall), und es wird nicht garantiert, dass SQL Server immer Pläne generiert, die dieselben beibehalten Bei der Reihenfolge zwischen dem Abfragetext und dem Abfrageplan sind Sie nur geringfügig besser dran.
Wir können dies jedoch weiter untersuchen. Wenn das Abfrageoptimierungsprogramm die Verkettungsoperatoreingabe neu anordnen konnte, sollten Zeilen in der undokumentierten DMV vorhanden sein, sys.dm_exec_query_transformation_stats
die dieser Optimierung entsprechen.
SELECT * FROM sys.dm_exec_query_transformation_stats
WHERE name LIKE '%CON%' OR name LIKE '%UNIA%'
In SQL Server 2012 Enterprise Edition werden 24 Zeilen erstellt. Ignoriert man die falschen Übereinstimmungen für Umwandlungen, die sich auf Konstanten beziehen, gibt es eine Umwandlung, die sich auf den physischen Verknüpfungsoperator UNIAtoCON
(Union All to Concatenation) bezieht . Auf der Ebene des physischen Operators wird ein Verkettungsoperator, der einmal ausgewählt wurde, in der Reihenfolge des Operators verarbeitet, aus dem er abgeleitet wurde.
Tatsächlich ist das nicht ganz richtig. Nach der Optimierung gibt es Umschreibungen, mit denen die Eingaben für einen physischen Verkettungsoperator nach Abschluss der kostenbasierten Optimierung neu angeordnet werden können. Ein Beispiel tritt auf, wenn die Verkettung einem Zeilenziel unterliegt (daher ist es möglicherweise wichtig, zuerst von der billigeren Eingabe zu lesen). Weitere Informationen finden Sie unter UNION ALL
Optimierung von Paul White.
Diese späte physische Umschreibung war bis einschließlich SQL Server 2008 R2 funktionsfähig, aber eine Regression bedeutete, dass sie nicht mehr auf SQL Server 2012 und höher angewendet wurde. Es wurde ein Fix veröffentlicht , mit dem dieses Neuschreiben für SQL Server 2014 und höher (nicht 2012) mit aktivierten Hotfixes für das Abfrageoptimierungsprogramm wiederhergestellt wird (z. B. Ablaufverfolgungsflag 4199).
Aber über den Logical Union All Operator ( UNIA
)? Es gibt eine UNIAReorderInputs
Transformation, die die Eingaben neu anordnen kann. Es gibt auch zwei physische Operatoren, die zum Implementieren einer logischen Union All UNIAtoCON
und UNIAtoMERGE
(Union All to Merge Union) verwendet werden können.
Aus diesem Grund kann das Abfrageoptimierungsprogramm die Eingaben für a neu anordnen UNION ALL
. Es scheint sich jedoch nicht um eine allgemeine Transformation zu handeln (keine Verwendung von UNIAReorderInputs
auf den SQL-Servern, auf die ich problemlos zugreifen kann. Wir kennen die Umstände nicht, unter denen das Optimierungsprogramm verwendet werden würde UNIAReorderInputs
. Es wird jedoch auf jeden Fall verwendet, wenn ein Plan erstellt oder verwendet wird Der Planhinweis wird verwendet, um einen Plan zu erzwingen, der unter Verwendung der oben erwähnten physisch neu geordneten Eingaben für das Zeilenziel generiert wird.
Gibt es eine Möglichkeit, die Engine mehr als eine Eingabe gleichzeitig verarbeiten zu lassen?
Der physikalische Operator Verkettung kann in einem parallelen Abschnitt eines Plans vorhanden sein. Mit einigen Schwierigkeiten konnte ich mit der folgenden Abfrage einen Plan mit parallelen Verkettungen erstellen:
SELECT userid, regdate FROM ( --Users table is around 3mil rows
SELECT userid, RegDate FROM users WHERE userid > 1000000
UNION
SELECT userid, RegDate FROM users WHERE userid < 1000000
UNION all
SELECT userid, RegDate FROM users WHERE userid < 2000000
) d ORDER BY RegDate OPTION (RECOMPILE)
Im engeren Sinne scheint der physikalische Verkettungsoperator also Eingaben immer auf konsistente Weise zu verarbeiten (oberste zuerst, unterste Sekunde); Das Optimierungsprogramm kann jedoch die Reihenfolge der Eingaben ändern, bevor der physische Operator ausgewählt wird, oder eine Zusammenführungsvereinigung anstelle einer Verkettung verwenden.