Gibt es eine Möglichkeit, das Ergebnis mit genau 3 verschiedenen Anleitungen und nicht mehr zu erstellen? Ich hoffe, dass wir in Zukunft Fragen besser beantworten können, indem wir Planungshandbücher mit CTE-Abfragen einbeziehen, auf die mehrmals verwiesen wird, um einige SQL Server-CTE-Macken zu überwinden.
Nicht heute. Nicht rekursive allgemeine Tabellenausdrücke (Common Table Expressions, CTEs) werden als Definitionen der Inline-Ansicht behandelt und vor der Optimierung an jeder Stelle, auf die verwiesen wird (genau wie bei regulären Ansichtsdefinitionen), in die logische Abfragestruktur erweitert. Der logische Baum für Ihre Abfrage lautet:
LogOp_OrderByCOL: Union1007 ASC COL: Union1015 ASC
LogOp_Project COL: Union1006 COL: Union1007 COL: Union1014 COL: Union1015
LogOp_Join
LogOp_ViewAnchor
LogOp_UnionAll
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_ViewAnchor
LogOp_UnionAll
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
Beachten Sie die beiden View-Anker und die sechs Aufrufe der intrinsischen Funktion, newid
bevor mit der Optimierung begonnen wird. Trotzdem sind viele Leute der Meinung, dass der Optimierer in der Lage sein sollte, zu identifizieren, dass die erweiterten Teilbäume ursprünglich ein einzelnes referenziertes Objekt waren, und dies entsprechend zu vereinfachen. Es gab auch mehrere Connect-Anforderungen , um die explizite Materialisierung eines CTE oder einer abgeleiteten Tabelle zu ermöglichen.
Bei einer allgemeineren Implementierung sollte der Optimierer erwägen, beliebige allgemeine Ausdrücke zu materialisieren, um die Leistung zu verbessern ( CASE
eine Unterabfrage ist ein weiteres Beispiel, bei dem heute Probleme auftreten können). Microsoft Research veröffentlichte bereits 2007 ein Papier (PDF) zu diesem Thema, das bislang jedoch nicht implementiert wurde. Derzeit beschränken wir uns auf die explizite Materialisierung mit Tabellenvariablen und temporären Tabellen.
SQLKiwi hat das Erstellen von Plänen in SSIS erwähnt. Gibt es eine Möglichkeit oder ein nützliches Tool, um beim Erstellen eines guten Plans für SQL Server zu helfen?
Dies war nur ein Wunschdenken von meiner Seite und ging weit über die Idee der Änderung von Planungsleitfäden hinaus. Grundsätzlich ist es möglich, ein Tool zur direkten Bearbeitung von Showplan-XML zu schreiben, aber ohne spezielle Optimierungsinstrumente wäre die Verwendung des Tools wahrscheinlich eine frustrierende Erfahrung für den Benutzer (und der Entwickler wird darüber nachdenken).
Im speziellen Kontext dieser Frage wäre ein solches Tool immer noch nicht in der Lage, die CTE-Inhalte auf eine Weise zu materialisieren, die von mehreren Verbrauchern verwendet werden könnte (um in diesem Fall beide Eingaben dem Cross-Join zuzuführen). Das Optimierungs- und Ausführungsmodul unterstützt Spools für mehrere Konsumenten, jedoch nur für bestimmte Zwecke - von denen keines für dieses bestimmte Beispiel geeignet sein kann.
Obwohl ich nicht sicher bin, habe ich eine ziemlich starke Vermutung, dass die RelOps verfolgt werden können (Nested Loop, Lazy Spool), auch wenn die Abfrage nicht genau mit dem Plan übereinstimmt - zum Beispiel, wenn Sie 4 und 5 zum CTE hinzugefügt haben Es wird weiterhin derselbe Plan verwendet (scheinbar auf SQL Server 2012 RTM Express getestet).
Hier besteht ein angemessenes Maß an Flexibilität. Die breite Form des XML-Plans wird verwendet, um die Suche nach einem endgültigen Plan zu leiten (obwohl viele Attribute vollständig ignoriert werden, z. B. der Partitionierungstyp bei Börsen), und die normalen Suchregeln werden ebenfalls erheblich gelockert. Beispielsweise wird das vorzeitige Bereinigen von Alternativen aus Kostengründen deaktiviert, die explizite Einführung von Cross-Joins ist zulässig, und skalare Operationen werden ignoriert.
Es gibt zu viele Details in in die Tiefe zu gehen, aber die Platzierung der Filter und Compute Skalare kann nicht erzwungen werden, und Prädikate der Form column = value
verallgemeinert so ein Plan enthalten X = 1
oder X = @X
kann auf eine Abfrage angewendet werden , enthalten X = 502
oder X = @Y
. Diese besondere Flexibilität kann bei der Suche nach einem natürlichen Plan für die Erzwingung von Gewalt sehr hilfreich sein.
Im konkreten Beispiel kann die Konstante Union All immer als Konstantenscan implementiert werden. Die Anzahl der Eingänge in die Union All spielt keine Rolle.