It is common for queries to restrict the result of a view so that only a few of the records are returned. In cases where the view contains GROUP BY or UNION, it is preferable for the database server to only compute the result for the desired rows. Predicate pushdown is performed for a predicate if, and only if, the predicate refers exclusively to the columns of a single view or derived table. A join predicate, for example, is not pushed down into the view.
Suppose you have the view ProductSummary defined as follows:
CREATE VIEW ProductSummary( ID, NumberOfOrders, TotalQuantity) AS SELECT ProductID, count(*), sum( Quantity ) FROM SalesOrderItems GROUP BY ProductID;
For each product ordered, the ProductSummary view returns a count of the number of orders that include it, and the sum of the quantities ordered over all of the orders. Now consider the following query over this view:
SELECT * FROM ProductSummary WHERE ID = 300;
The query restricts the output to only the row for which the value in the ID column is 300. This query, and the query in the definition of the view could be combined into the following, semantically-equivalent, SELECT statement:
SELECT ProductID, COUNT(*), SUM( Quantity ) FROM SalesOrderItems GROUP BY ProductID HAVING ProductID = 300;
An unsophisticated execution plan for this query would involve computing the aggregates for each product, and then restricting the result to only the single row for product ID 300. However, the HAVING predicate on the ProductID column can be pushed into the query's WHERE clause since it is a grouping column, yielding the following:
SELECT ProductID, COUNT(*), SUM( Quantity ) FROM SalesOrderItems WHERE ProductID = 300 GROUP BY ProductID;
This SELECT statement significantly reduces the computation required. If this predicate is sufficiently selective, the optimizer could now use an index on ProductID to retrieve only those rows for product 300, rather than sequentially scanning the SalesOrderItems table.
The same optimization is also used for views involving UNION or UNION ALL.