Gibt eine neu geschriebene SELECT-, DELETE- oder UPDATE-SQL-Anweisung aus.
REWRITE( Select_Anweisung [, 'ANSI' ] )
Select_Anweisung Die SQL-Anweisung, an der die Neuschreibungsoptimierungen angewendet werden, um die Ergebnisse der Funktion zu generieren
LONG VARCHAR
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.
SQL/2003 Erweiterung des Herstellers
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'; |
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |