Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Abfrageverarbeitung » Abfragen optimieren und ausführen

 

Semantische Abfragentransformation

Um effizient zu arbeiten, schreibt SQL Anywhere Ihre Abfragen in semantisch äquivalente, aber syntaktisch unterschiedliche Formen um. SQL Anywhere führt viele unterschiedliche Neuschreibungsvorgänge durch.

Wenn Sie die Zugriffspläne studieren, werden Sie häufig feststellen, dass sie keine wörtliche Interpretation Ihrer ursprünglichen Anweisung darstellen. Um beispielsweise Ihre SQL-Anweisungen effizienter zu gestalten, versucht der Optimierer, so weit es geht Unterabfragen mit Joins umzuschreiben.

In der Neuschreibungsphase für Abfragen führt SQL Anywhere mehrere Transformationen durch, um nach effizienteren und sinnvolleren Darstellungen der Abfrage zu suchen. Da die Abfrage möglicherweise in eine semantisch gleichwertige Abfrage umgeschrieben wird, kann sich der Plan erheblich von der wörtlichen Interpretation Ihrer ursprünglichen Abfrage unterscheiden. Übliche Änderungen sind z.B. folgende:

  • Unnötige DISTINCT-Bedingungen entfernen

  • Unterabfragen entschachteln

  • Prädikat-Pushdown in UNION- oder GROUP-Ansichten und abgeleiteten Tabellen durchführen

  • OR- und IN-Listen-Prädikate optimieren

  • LIKE-Prädikate optimieren

  • Outer-Joins zu Inner-Joins konvertieren

  • Outer-Joins und Inner-Joins entfernen

  • Nutzbare Bedingungen durch Prädikat-Inferenz suchen

  • Unnötige Konvertierung der Groß- und Kleinschreibung entfernen

  • Unterabfragen als EXISTS-Prädikate umschreiben

Hinweis

Einige Neuschreibungsoptimierungen für Abfragen können nicht im Hauptabfrageblock durchgeführt werden, wenn der Cursor aktualisierbar ist. Deklarieren Sie den Cursor als schreibgeschützt, um die Optimierungen nutzen zu können. Weitere Hinweise finden Sie unter Cursortypen auswählen und DECLARE CURSOR-Anweisung [ESQL] [SP].

Ein Beispiel für eine Optimierung, die nicht durchgeführt werden kann, wenn der Hauptabfrageblock ein aktualisierbarer Cursor ist, finden Sie unter Unnötige Inner- und Outer-Joins eliminieren.

Einige Neuschreibungsoptimierungen, die während der Neuschreibungsphase für Abfragen durchgeführt werden, sind in den Ergebnissen der Funktion REWRITE einsehbar. Weitere Hinweise finden Sie unter REWRITE-Funktion [Verschiedene].

Beispiel

Im Gegensatz zur SQL-Sprachdefinition schreiben manche Sprachen das Verhalten bei AND- und OR-Vorgängen genau vor. Manche garantieren, dass die Bedingung auf der linken Seite zuerst ausgewertet wird. Wenn bereits dadurch die Gültigkeit der gesamten Bedingung ermittelt werden kann, garantiert der Compiler, dass die Bedingung auf der rechten Seite nicht ausgewertet wird.

Diese Anordnung ermöglicht es Ihnen, Bedingungen zu kombinieren, die sonst zwei verschachtelte IF-Anweisungen verlangen würden. In C können Sie zum Beispiel testen, ob ein Zeiger NULL ist, bevor Sie ihn verwenden. Sie können die verschachtelten Bedingungen in der ersten Anweisung ersetzen, indem Sie die Syntax verwenden, die in der folgenden zweiten Anweisung gezeigt wird:

if ( X != NULL ) {
   if ( X->var != 0 ) {
      ... statements ...
   }
}
if ( X != NULL && X->var != 0 ) {
      ... statements ...
}

Anders als C kennt SQL keine solchen Regeln für die Ausführungsreihenfolge. SQL Anywhere steht es frei, die Reihenfolge solcher Bedingungen zu verändern, wo es nötig ist. Die ursprüngliche und die neu geordnete Form sind semantisch gleichwertig, da die SQL-Sprachspezifikation die verschiedenen Reihenfolgen nicht unterscheidet. Vor allem dem Abfrageoptimierer steht es völlig frei, Prädikate in einer WHERE-, HAVING- oder ON-Klausel neu anzuordnen.


Unnötige DISTINCT-Bedingungen eliminieren
Unterabfragen entschachteln
Prädikat-Pushdown in UNION- oder GROUP-Ansichten und abgeleiteten Tabellen
OR- und IN-Listen-Prädikate optimieren
LIKE-Prädikate optimieren
Outer-Joins in Inner-Joins konvertieren
Unnötige Inner- und Outer-Joins eliminieren
Nutzbare Bedingungen durch Prädikat-Inferenz suchen
Unnötige Konvertierung der Groß- und Kleinschreibung eliminieren
Umschreiben von Unterabfragen als EXISTS-Prädikate
Inlining von benutzerdefinierten Funktionen
Inlining von einfachen Systemprozeduren