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.
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; |
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 |