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

 

Unnötige Inner- und Outer-Joins eliminieren

Mit der Join-Eliminierung durch Neuschreibungsoptimierung wird der Join-Grad der Abfrage, sofern möglich, durch Eliminierung von Tabellen aus der Abfrage reduziert. Normalerweise wird diese Optimierung auf Inner-Joins angewendet, die als Primärschlüssel-Fremdschlüssel-Joins oder als Primärschlüssel-Primärschlüssel-Joins definiert sind. Die Optimierung durch Join-Eliminierung kann auch auf Tabellen angewendet werden, die in Outer-Joins benutzt werden, obwohl die Bedingungen, unter denen die Optimierung möglich ist, sehr viel komplexer sind.

Die Optimierung eliminiert keine Tabellen, die mit UPDATE oder DELETE WHERE CURRENT aktualisierbar sind, auch dann nicht, wenn die Eliminierung richtig wäre. Dies kann sich negativ auf die Performance der Abfrage auswirken. Wenn die Abfrage jedoch nur zum Lesen dient, können Sie in der SELECT-Anweisung FOR READ ONLY angeben, um sicherzustellen, dass Join-Eliminierungen durchgeführt werden. Beachten Sie, dass Tabellen, die in Unterabfragen oder in verschachtelten abgeleiteten Tabellen erscheinen, nicht aktualisierbar sind, auch dann nicht, wenn die Tabellen im Hauptabfrageblock aktualisierbar sind.

Zusammengefasst gibt es drei Hauptkategorien von Joins, auf die diese Neuschreibungsoptimierung angewendet werden kann:

  • Der Join ist ein Primärschlüssel-Fremdschlüssel-Join und in der Abfrage werden lediglich Primärschlüsselspalten aus der Primärtabelle referenziert. In diesem Fall wird die Primärschlüsseltabelle eliminiert, falls sie nicht aktualisierbar ist.

  • Der Join ist ein Primärschlüssel-Primärschlüssel-Join zwischen zwei Instanzen in derselben Tabelle. In diesem Fall wird eine der Tabellen eliminiert, falls sie nicht aktualisierbar ist.

  • Der Join ist ein Outer-Join und der Nullwert-liefernde Tabellenausdruck hat folgende Eigenschaften:

    • Der Nullwert-liefernde Tabellenausdruck liefert höchstens eine Zeile für jede Zeile der bewahrten Seite des Outer-Joins.

    • Keiner der Ausdrücke, die von dem Nullwert-liefernden Ausdruck erstellt werden, wird im Rest der Abfrage nach dem Outer-Join benötigt.

Beispiel

In der folgenden Abfrage ist der Join beispielsweise ein Primärschlüssel-Primärschlüssel-Join, und die Primärschlüsseltabelle "Products" kann eliminiert werden:

SELECT s.ID, s.LineID, p.ID
FROM SalesOrderItems s KEY JOIN Products p
FOR READ ONLY;

Die Abfrage könnte folgendermaßen neu geschrieben werden:

SELECT s.ID, s.LineID, s.ProductID
FROM SalesOrderItems s
WHERE s.ProductID IS NOT NULL
FOR READ ONLY;

Die zweite Abfrage ist der ersten semantisch gleichwertig, weil keine Zeile aus der Tabelle "SalesOrderItems" mit einem NULL-Fremdschlüssel im Hinblick auf "Products" im Ergebnis erscheint.

In der folgenden Abfrage kann der Outer-Join eliminiert werden, da der Nullwert-liefernde Tabellenausdruck höchstens eine Zeile für jede Zeile der bewahrten Seite erstellen kann und keine der Spalten von "Products" über den Left-Outer-Join verwendet wird.

SELECT s.ID, s.LineID
FROM SalesOrderItems s LEFT OUTER JOIN Products p ON p.ID = s.ProductID
WHERE s.Quantity > 5 
FOR READ ONLY;

Die Abfrage wird folgendermaßen neu geschrieben:

SELECT s.ID, s.LineID
FROM SalesOrderItems s  
WHERE s.Quantity > 5 
FOR READ ONLY;