Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Mailing Lists -> Oracle-L -> To MV or not MV, that is my question
Hey all,
Our ERP DB is a modest ~40GB on 9.2.0.5.0 on HPUX 11.11. One of the company metrics involves determining usage of parts. The current method of capturing this data is a beast. Enter the materialized view. Not having used them before, but realizing their potential, I write up this MV:
CREATE MATERIALIZED VIEW qt_part_hist_24_mon_mv
PARALLEL 2
BUILD IMMEDIATE
--REFRESH FAST
REFRESH COMPLETE
ON DEMAND
WITH ROWID
USING DEFAULT LOCAL ROLLBACK SEGMENT
--ENABLE QUERY REWRITE
AS
SELECT partno,
DECODE(warehouse,' ','00',NULL,'00',warehouse) warehouse, transtype, accountno, SUM(CASE WHEN time_stamp >= RPAD(TO_CHAR(SYSDATE-NUMTODSINTERVAL(7,'DAY'),'YYYYMMDD'),16,'0') THEN transqty ELSE 0 END) "WEEK", SUM(CASE WHEN time_stamp >= RPAD(TO_CHAR(SYSDATE-NUMTOYMINTERVAL(3,'MONTH'),'YYYYMMDD'),16,'0') THEN transqty ELSE 0 END) "MONTH_3", SUM(CASE WHEN time_stamp >= RPAD(TO_CHAR(SYSDATE-NUMTOYMINTERVAL(6,'MONTH'),'YYYYMMDD'),16,'0') THEN transqty ELSE 0 END) "MONTH_6", SUM(CASE WHEN time_stamp >= RPAD(TO_CHAR(SYSDATE-NUMTOYMINTERVAL(12,'MONTH'),'YYYYMMDD'),16,'0') THEN transqty ELSE 0 END) "MONTH_12", SUM(CASE WHEN time_stamp >= RPAD(TO_CHAR(SYSDATE-NUMTOYMINTERVAL(18,'MONTH'),'YYYYMMDD'),16,'0') THEN transqty ELSE 0 END) "MONTH_18", SUM(CASE WHEN time_stamp >= RPAD(TO_CHAR(SYSDATE-NUMTOYMINTERVAL(24,'MONTH'),'YYYYMMDD'),16,'0') THEN transqty ELSE 0 END) "MONTH_24", SUM(CASE WHEN SUBSTR(time_stamp,1,4) = TO_CHAR(SYSDATE,'YYYY') THEN transqty ELSE 0 END) "YTD", SUM(CASE WHEN SUBSTR(time_stamp,1,4) = TO_CHAR(SYSDATE-NUMTOYMINTERVAL(1,'YEAR'),'YYYY') THEN transqty ELSE 0 END) "PREV_YEAR", SUM(CASE WHEN SUBSTR(time_stamp,1,4) = TO_CHAR(SYSDATE,'YYYY') AND SUBSTR(time_stamp,5,2) IN ('01','02','03') THEN transqty ELSE 0 END) "Q1", SUM(CASE WHEN SUBSTR(time_stamp,1,4) = TO_CHAR(SYSDATE,'YYYY') AND SUBSTR(time_stamp,5,2) IN ('04','05','06') THEN transqty ELSE 0 END) "Q2", SUM(CASE WHEN SUBSTR(time_stamp,1,4) = TO_CHAR(SYSDATE,'YYYY') AND SUBSTR(time_stamp,5,2) IN ('07','08','09') THEN transqty ELSE 0 END) "Q3", SUM(CASE WHEN SUBSTR(time_stamp,1,4) = TO_CHAR(SYSDATE,'YYYY') AND SUBSTR(time_stamp,5,2) IN ('10','11','12') THEN transqty ELSE 0 END) "Q4" FROM part_history WHERE fiscal_year > TO_NUMBER(TO_CHAR(SYSDATE,'YYYY')) - 3GROUP BY partno, DECODE (warehouse,' ', '00',NULL, '00',warehouse), transtype, accountno;
I don't particularly agree with the usefulness of some of these columns (I would think anything forward of previous quarter's usage could incorrectly skew the data, but I'm just a computer geek), but this is what's requested. My problem isn't with the MV itself, but with justifying why we should use it. As I'm dealving into this, I see that since SYSDATE is a non-deterministic function, it precludes the use of REFRESH FAST and QUERY REWRITE. While I'm less concerned about QUERY REWRITE, I don't see any advantage of using a REFRESH COMPLETE MV over a well-trusted TRUNCATE/INSERT-SELECT.
Thoughts???
BTW, yes, the "time_stamp" column is CHAR(16), thoughtfully supplied by our ERP vendor, probably because 8i didn't have the granularity in DATE types like TIMESTAMP does.
TIA,
Rich
Rich Jesse System/Database Administrator rich.jesse_at_quadtechworld.com QuadTech, Sussex, WI USAPlease see the official ORACLE-L FAQ: http://www.orafaq.com
----------------------------------------------------------------