CREATE LOGICAL PARTITION TRACKING ON mysales
PARTITION BY RANGE (time_id)
INTERVAL(NUMTOYMINTERVAL(2, 'YEAR'))
(
PARTITION p0 VALUES LESS THAN (TO_DATE('7-15-2005', 'MM-DD-YYYY')),
PARTITION p1 VALUES LESS THAN (TO_DATE('7-15-2007', 'MM-DD-YYYY'))
);
CREATE MATERIALIZED VIEW sales_age_time
REFRESH FAST
ENABLE QUERY REWRITE
AS SELECT SUM(s.amount_sold) amount_total, c.age, s.time_id
FROM mysales s, mycustomers c
WHERE s.cust_id = c.cust_id
GROUP BY c.age, s.time_id;
SELECT mview_name, DETAILOBJ_NAME, DETAIL_LOGICAL_PARTITION_NAME LPARTNAME,
DETAIL_LOGICAL_PARTITION_NUMBER LPART#, FRESHNESS
FROM DBA_MVIEW_DETAIL_LOGICAL_PARTITION
WHERE mview_name = 'SALES_AGE_TIME'
ORDER BY 1,2,3;
EXECUTE DBMS_MVIEW.EXPLAIN_MVIEW ('sales_age_time');
SELECT CAPABILITY_NAME, RELATED_TEXT, POSSIBLE
FROM MV_CAPABILITIES_TABLE
WHERE MVNAME = 'SALES_AGE_TIME' AND CAPABILITY_NAME LIKE '%LPT%'
ORDER BY 1, 2;
これは、次の出力を示しています。
CAPABILITY_NAME RELATED_TEXT POSSIBLE
------------------------- ------------------------- –--------------
LPT Y
LPT_TABLE MYCUSTOMERS Y
LPT_TABLE MYSALES Y
LPT_TABLE_REWRITE MYCUSTOMERS Y
LPT_TABLE_REWRITE MYSALES Y
REWRITE_LPT Y
REFRESH_FAST_LPT Y
SELECT mview_name, DETAILOBJ_NAME, DETAIL_LOGICAL_PARTITION_NAME LPARTNAME,
DETAIL_LOGICAL_PARTITION_NUMBER LPART#, FRESHNESS
FROM DBA_MVIEW_DETAIL_LOGICAL_PARTITION
WHERE mview_name = 'SALES_AGE_TIME'
ORDER BY 1,2,3;
DELETE FROM rewrite_table;
DECLARE
stmt varchar2(2000) := q'#select sum(s.amount_sold) amount_total,
c.age, s.time_id
FROM mysales s, mycustomers c
WHERE s.cust_id = c.cust_id
AND s.time_id < TO_DATE ('07-07-2007', 'MM-DD-YYYY')
AND c.age < 18
GROUP BY c.age, s.time_id#';
BEGIN
dbms_mview.explain_rewrite (stmt,'sales_age_time');
END;
/
SELECT mv_name, sequence, pass, message FROM rewrite_table;
REWRITE_TABLEを問い合せて、リライトを確認します。
SELECT mv_name, sequence, pass, message FROM rewrite_table;
次の問合せを実行します。
SELECT SUM(s.amount_sold) amount_total,
c.age, s.time_id
FROM mysales s, mycustomers c
WHERE s.cust_id = c.cust_id
AND s.time_id < TO_DATE ('07-07-2007', 'MM-DD-YYYY')
AND c.age < 18
GROUP BY c.age, s.time_id;
上記の問合せの実行計画を表示して、リライトを確認します。
SELECT * FROM TABLE(dbms_xplan.display_cursor);
PLAN_TABLE_OUTPUT
__________________________________________________
SQL_ID ampuzk8tbp6df, child number 0
-------------------------------------
SELECT SUM(s.amount_sold) amount_total,
c.age, s.time_id
FROM mysales s, mycustomers c
WHERE s.cust_id = c.cust_id
AND s.time_id < TO_DATE ('07-07-2007', 'MM-DD-YYYY')
AND c.age < 18
GROUP BY c.age, s.time_id;
Plan hash
value: 3902795718
-----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost
(%CPU)| Time
|-----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | |
| | 2 (100)|
||* 1 | MAT_VIEW
REWRITE ACCESS FULL| SALES_AGE_TIME | 1 | 35 |
2 (0)| 00:00:01
|-----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(("SALES_AGE_TIME"."TIME_ID"<TO_DATE('2007-07-07 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "SALES_AGE_TIME"."AGE"<18))
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
26 rows selected.
SELECT mview_name, DETAILOBJ_NAME, DETAIL_LOGICAL_PARTITION_NAME LPARTNAME, DETAIL_LOGICAL_PARTITION_NUMBER LPART#, FRESHNESS
FROM DBA_MVIEW_DETAIL_LOGICAL_PARTITION
WHERE mview_name = 'SALES_AGE_TIME'
ORDER BY 1,2,3;