-- 売り上げサンプル表(明細)CREATE TABLE RIVUS.SALES
(
PRODUCT_NO VARCHAR2(5),
SALES NUMBER,
SALE_ON DATE
);
--サンプル・マテリアライズドビュー--- 月別・商品別 売上
DROP MATERIALIZED VIEW RIVUS.SALES_SUM_PRODUCT_MONTH;
CREATE MATERIALIZED VIEW
SALES_SUM_PRODUCT_MONTH
BUILD IMMEDIATE
REFRESH COMPLETE
ENABLE QUERY REWRITE
AS
SELECT
PRODUCT_NO, TRUNC(SALE_ON, 'MONTH') SALE_ON, SUM(SALES) SUM_SALES
FROM
SALES
GROUP BY
PRODUCT_NO, TRUNC(SALE_ON, 'MONTH')
;
--- 商品別 売上
DROP MATERIALIZED VIEW RIVUS.SALES_SUM_PRODUCT;
CREATE MATERIALIZED VIEW
SALES_SUM_PRODUCT
BUILD IMMEDIATE
REFRESH COMPLETE
ENABLE QUERY REWRITE
AS
SELECT
PRODUCT_NO, SUM(SALES) SUM_SALES
FROM
SALES
GROUP BY
PRODUCT_NO
;
クエリー・リライトを 使用可能にする。
ALTER SESSION SET QUERY_REWRITE_ENABLED=TRUE; { TRUE | FALSE | FORCE }
クエリーが書き換えられるSQL例(使用しているヒント句はコストを無視して適用させる。通常は不要)
-- 月別 商品別 サマリ表への書き換えSELECT/*+ REWRITE(SALES_SUM_PRODUCT_MONTH) */
PRODUCT_NO, SUM(SALES) SUM_SALES
FROM
SALES
WHERE
PRODUCT_NO = 'F001'
AND TRUNC(SALE_ON, 'MONTH') = TO_DATE('2005/10','YYYY/MM')
GROUP BY
PRODUCT_NO, TRUNC(SALE_ON, 'MONTH');
---- オラクル内部では、以下のように変換されて実行される。SELECT
PRODUCT_NO, SUM_SALES
FROM
SALES_SUM_PRODUCT_MONTH
WHERE
PRODUCT_NO = 'F001'
AND SALE_ON = TO_DATE('2005/10','YYYY/MM')
-- 商品別 サマリ表への書き換えSELECT/*+ REWRITE(SALES_SUM_PRODUCT) */
PRODUCT_NO, SUM(SALES) SUM_SALES
FROM
SALES
WHERE
PRODUCT_NO = 'F001'GROUP BY
PRODUCT_NO
---- オラクル内部では、以下のように変換されて実行される。SELECT
PRODUCT_NO, SUM_SALES
FROM
SALES_SUM_PRODUCT
WHERE
PRODUCT_NO = 'F001'