Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum verursacht diese (nicht korrelierte) Unterabfrage solche Probleme?

Ich habe die Erfahrung gemacht, dass der SQL-Optimierer umso weniger in der Lage ist, geschickte Pläne zu erstellen, je komplexer Ihre Abfragen werden. Hier haben Sie 16 Verknüpfungen, einige oder die meisten sind äußere Verknüpfungen, Sie haben mindestens eine Unterabfrage ... werfen Sie genügend Indizes, Kardinalitäten, Ansichten, äußere Anwendungen ein und wer weiß was noch und niemand, nicht einmal Microsoft Ingenieure* können Routinen entwickeln, die einheitlich und regelmäßig die optimalsten Pläne generieren.

Was Sie beschrieben haben, habe ich unzählige Male erlebt - ändern Sie eine einfache Sache in einer chaotischen Abfrage und alles ist eine Größenordnung schneller (oder, Zähneknirschen, langsamer). Ich habe keine Methode, um festzustellen, wann komplex zu komplex ist, es ist mehr ein Gefühl als alles andere. Meine allgemeine Faustregel lautet:Wenn es zu lang oder zu komplex aussieht, vereinfachen Sie es, wo immer Sie können – z schnell mit einer kleinen Ergebnismenge ausführen, diese zuerst ausführen und die Ergebnisse in einer temporären Tabelle speichern.

(* Bitte beachten Sie, dass dies mildes Sarcsam ist)