射影の後付けにより、ビューを折り重ねることができます。これを実行しない場合、そのビューはスプールのままです(ビューの折重ねの詳細については、ビューの折重ねを参照)。例えば、CASE式を含むビューはマージされないこともあります。ただし、これらの式を除去できる場合、システムはビューの折重ねにより追加の書き換えを実行できることもあります。
射影の後付けの例
この例では、参照されるビューの列sales_by_productは合計だけです。このため、射影の後付けによって、sales_by_productの選択リストからproduct_keyとproduct_namの両方を削除できます。これらの列の指定は、ビューのGROUP BY句には保持しておく必要があることに注意してください。
CREATE VIEW sales_by_product AS SELECT product_key, product_name, SUM(quantity*amount) AS total FROM sales, product WHERE sales_product_key = product_key GROUP BY product_key, product_name; SELECT SUM(total) AS total_sales FROM sales_by_product;
この例から、包含問合わせブロックの選択リストから列を削除すると、ネストされたビューの選択リスト内の列に対する参照先の値が取得されるようになるため、射影を後付けすることによってカスケード効果を得られることが分かります。
ビューのどの列も参照されない場合も重要です。この例も、sales_by_productビューを使用します。
SELECT COUNT(*) AS cnt FROM sales_by_product;
リクエストはsales_by_productの列を参照しません。この結果、sales_by_producの選択リストをSELECT 0として書き換えることができます。これは、書き換えでは、正しい数の行が返されることのみを確認する必要があるためです。
また、リクエストによってビューや派生テーブルのどの列も参照されない場合で、ビューが1行のみ返すことが保証されている場合の例も、sales_by_productビューを使用します。
SELECT COUNT(*) AS cnt FROM (SELECT SUM(total) AS total_sales FROM sales_by_product) AS dt ;
このリクエストでは派生テーブルのどの行も参照されません。このとき、その選択リストは集約関数のみを指定するため、ビューには単一の行のみが含まれます。これらのビューは単一行ビューと呼ばれます。射影の後付けによって、このリクエストが次のように書き換えられます。
SELECT COUNT(*) AS cnt FROM (SELECT 0 AS dummy_col) AS dt ;
射影を後付けすると、参照先の値を取得する列が削除され、結果としてスプールのサイズが小さくなるため、これらの場合のパフォーマンスが向上します。