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

 

Prädikat-Pushdown in UNION- oder GROUP-Ansichten und abgeleiteten Tabellen

Häufig schränken Abfragen das Ergebnis einer Ansicht so ein, dass nur wenige Datensätze zurückgegeben werden. Wenn die Ansicht GROUP BY oder UNION enthält, ist es vorzuziehen, wenn der Datenbankserver lediglich das Ergebnis für die gewünschten Zeilen berechnet. Ein Prädikat-Pushdown erfolgt für ein Prädikat nur dann, wenn sich das Prädikat ausschließlich auf die Spalten einer einzelnen Ansicht oder einer abgeleiteten Tabelle bezieht. Ein JOIN-Prädikat wird beispielsweise in der Ansicht nicht unterdrückt.

Beispiel

Angenommen, die Ansicht "ProductSummary" ist wie folgt definiert:

CREATE VIEW ProductSummary( ID, 
        NumberOfOrders, 
        TotalQuantity) AS
SELECT ProductID, COUNT( * ), sum( Quantity )
FROM SalesOrderItems
GROUP BY ProductID;

Für jedes bestellte Produkt liefert die Ansicht "ProductSummary" die Anzahl der Bestellungen, in denen es aufgeführt ist, und die Summe der bestellten Mengen aus allen Bestellungen. Sehen Sie sich die folgende Abfrage für diese Ansicht an:

SELECT *
FROM ProductSummary
WHERE ID = 300;

Die Abfrage beschränkt die Ausgabe auf die Zeile, deren Wert in der ID-Spalte 300 beträgt. Diese Abfrage und die Abfrage in der Definition der Ansicht könnten zu folgender semantisch gleichwertigen SELECT-Anweisung kombiniert werden:

SELECT ProductID, COUNT( * ), SUM( Quantity )
FROM SalesOrderItems
GROUP BY ProductID
HAVING ProductID = 300;

Bei einem einfachen Ausführungsplan für diese Abfrage würden die Aggregate für jedes Produkt berechnet und dann das Ergebnis auf eine einzelne Zeile für die Produkt-ID 300 begrenzt werden. Jedoch kann das HAVING-Prädikat für die Spalte "ProductID" an die WHERE-Klausel der Abfrage übergeben werden, da es sich um eine gruppierte Spalte handelt. Dies führt zu folgendem Ergebnis:

SELECT ProductID, COUNT( * ), SUM( Quantity )
FROM SalesOrderItems
WHERE ProductID = 300
GROUP BY ProductID;

Diese SELECT-Anweisung führt zu einer bedeutenden Reduzierung der erforderlichen Berechnungen. Wenn dieses Prädikat selektiv genug ist, könnte der Optimierer jetzt einen Index für "ProductID" verwenden, um nur diese Spalten für das Produkt 300 abzurufen und nicht die Tabelle "SalesOrderItems" sequenziell zu durchsuchen.

Dieselbe Optimierung wird auch für Ansichten mit UNION oder UNION ALL verwendet.