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-Referenzhandbuch » Verwendung von SQL » SQL-Funktionen » SQL-Funktionen (P-Z)

 

REWRITE-Funktion [Verschiedene]

Gibt eine neu geschriebene SELECT-, DELETE- oder UPDATE-SQL-Anweisung aus.

Syntax
REWRITE( Select_Anweisung [, 'ANSI' ] )
Parameter
  • Select_Anweisung   Die SQL-Anweisung, an der die Neuschreibungsoptimierungen angewendet werden, um die Ergebnisse der Funktion zu generieren

Rückgabe

LONG VARCHAR

Bemerkungen

Sie können die REWRITE-Funktion ohne ANSI-Argument verwenden, um besser zu verstehen, wie der Optimierer den Zugriffsplan für eine gegebene Abfrage erstellt hat. Insbesondere können Sie herausfinden, wie die Bedingungen in den Klauseln WHERE, ON und HAVING der Anweisung von SQL Anywhere neu geschrieben wurden und dann ermitteln, ob anwendbare Indizes existieren, die zur Verbesserung der Ausführungszeit herangezogen werden können.

Die Anweisung, die von REWRITE zurückgegeben wird, passt unter Umständen nicht zu der Semantik der ursprünglichen Anweisung. Dies ist darauf zurückzuführen, dass einige Neuschreibungsoptimierungen interne Mechanismen einbauen, die nicht direkt in SQL übersetzt werden können. Beispielsweise kann die vom Server erfolgte Verwendung der Zeilenbezeichner zur Eliminierung von Duplikaten nicht in SQL übersetzt werden.

Die überarbeitete Abfrage der REWRITE-Funktion ist nicht für eine Ausführung ausgelegt. Es handelt sich um ein Tool zur Analyse von Performance-Fragen durch Aufzeigen der Vorkommnisse, die nach der Neuschreibungsphase an den Optimierer weitergeleitet werden.

Es gibt einige Neuschreibungsoptimierungen, die in der Ausgabe von REWRITE nicht wiedergegeben werden. Diese umfassen LIKE-Optimierungen, Optimierungen für Mindest- und Maximalfunktionen, Eliminierung von Ober- und Untergrenzwerten sowie die Einordnung von Prädikaten.

Wenn ANSI angegeben wird, gibt REWRITE das ANSI-Äquivalent der Anweisung zurück. In diesem Fall werden nur die folgenden Neuschreibungsoptimierungen angewendet:

  • Transact-SQL Outer-Joins werden als ANSI SQL Outer-Joins neu geschrieben.

  • Doppelte Korrelationsnamen werden gelöscht.

  • KEY- und NATURAL-Outer-Joins werden als ANSI SQL-Joins neu geschrieben.

Siehe auch
Standards und Kompatibilität
  • SQL/2003   Erweiterung des Herstellers

Beispiel

Das folgende Beispiel stellt zwei Neuschreibungsoptimierungen dar, die für eine Abfrage ausgeführt werden. Die erste ist die Entschachtelung der Unterabfrage in einen Join zwischen den Tabellen "Employees" und "SalesOrders". Die zweite Optimierung vereinfacht die Abfrage durch Löschen des Primärschlüssel- und Fremdschlüssel-Joins zwischen den Tabellen "Employees" und "SalesOrders". Teil der Neuschreibungsoptimierung ist das Ersetzen des Join-Prädikats e.EmployeeID=s.SalesRepresentative durch s.SalesRepresentative IS NOT NULL.

SELECT REWRITE( 'SELECT s.ID, s.OrderDate
    FROM SalesOrders s
    WHERE EXISTS ( SELECT *
       FROM Employees e
          WHERE e.EmployeeID = s.SalesRepresentative)' ) FROM dummy;

Die Abfrage gibt eine einzige Spalten-Ergebnismenge zurück, die die neugeschriebene Abfrage enthält:

'SELECT s.ID, s.OrderDate FROM SalesOrders s WHERE s.SalesRepresentative IS NOT NULL'

Im nächsten Beispiel verwendet REWRITE das ANSI-Argument.

SELECT REWRITE( 'SELECT DISTINCT s.ID, s.OrderDate, e.GivenName, e.EmployeeID
    FROM SalesOrders s, Employees e
          WHERE e.EmployeeID *= s.SalesRepresentative', 'ANSI' ) FROM dummy;

Das Ergebnis entspricht dem ANSI-Äquivalent der Anweisung. In diesem Fall wird der Transact-SQL Outer-Join in einen ANSI-Outer-Join konvertiert. Die Abfrage gibt eine einzige Spalten-Ergebnismenge zurück (zur besseren Lesbarkeit aufgeteilt in mehrere Zeilen):

'SELECT DISTINCT s.ID, s.OrderDate, e.GivenName, e.EmployeeID
 FROM Employees as e
 LEFT OUTER JOIN  SalesOrders as s
 ON e.EmployeeID = s.SalesRepresentative';