MV定義語句中包含Fact的VIEW,能否Rewrite ?
在資料倉儲環境中,複製一張dimension表是比較容易的事,但對於fact表,也許很多人更傾向於建立一個view,因為在新的環境裡複製一張十幾億條記錄的表,而且將來還要花心思去同步更新,其工作量是難以想象的。於是我們通常把MV的定義在IFCT對應的VIEW上,為了證明是否MV 定義語句裡面包含VIEW,也 可以達到REWRITE的效果,我們做如下測試:
1. 以SUM_SALES_PSCAT_WEEK_MV為原型,建立測試MV和定於語句中的所有Fact和dimension;
###SUM_SALES_PSCAT_WEEK_MV
### Definition: ######################
SELECT p.prod_subcategory, t.week_ending_day,
sum(s.amount_sold) AS sum_amount_sold
FROM sales s, products p, times t
where s.time_id = t.time_id and s.prod_id = p.prod_id
group by p.prod_subcategory, t.week_ending_day
---- 察看mview的定義語句和table的ddl:
select * from dba_mviews where mview_name='SUM_SALES_PSCAT_WEEK_MV'
select * from dba_tables where table_name='SUM_SALES_PSCAT_WEEK_MV'
######################## Build new MV ##############
------- create new products (新的dimension,用來對應新的fact view)
CREATE TABLE PRODUCTS_TEST_QR
(
PROD_ID NUMBER(6) NOT NULL,
PROD_NAME VARCHAR2(50 BYTE) NOT NULL,
PROD_DESC VARCHAR2(4000 BYTE) NOT NULL,
PROD_SUBCATEGORY VARCHAR2(50 BYTE) NOT NULL,
PROD_SUBCATEGORY_ID NUMBER NOT NULL,
PROD_SUBCATEGORY_DESC VARCHAR2(2000 BYTE) NOT NULL,
PROD_CATEGORY VARCHAR2(50 BYTE) NOT NULL,
PROD_CATEGORY_ID NUMBER NOT NULL,
PROD_CATEGORY_DESC VARCHAR2(2000 BYTE) NOT NULL,
PROD_WEIGHT_CLASS NUMBER(3) NOT NULL,
PROD_UNIT_OF_MEASURE VARCHAR2(20 BYTE),
PROD_PACK_SIZE VARCHAR2(30 BYTE) NOT NULL,
SUPPLIER_ID NUMBER(6) NOT NULL,
PROD_STATUS VARCHAR2(20 BYTE) NOT NULL,
PROD_LIST_PRICE NUMBER(8,2) NOT NULL,
PROD_MIN_PRICE NUMBER(8,2) NOT NULL,
PROD_TOTAL VARCHAR2(13 BYTE) NOT NULL,
PROD_TOTAL_ID NUMBER NOT NULL,
PROD_SRC_ID NUMBER,
PROD_EFF_FROM DATE,
PROD_EFF_TO DATE,
PROD_VALID VARCHAR2(1 BYTE)
)
TABLESPACE EXAMPLE
PCTUSED 0
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
NOLOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;
CREATE BITMAP INDEX PRODUCTS_PROD_TEST_QR ON PRODUCTS_test_qr
(PROD_STATUS)
NOLOGGING
TABLESPACE EXAMPLE
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
NOPARALLEL;
CREATE UNIQUE INDEX PRODUCTS_TEST_QR_PK ON PRODUCTS_test_qr
(PROD_ID)
NOLOGGING
TABLESPACE EXAMPLE
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
NOPARALLEL;
CREATE INDEX PRODUCTS_PROD_TEST_QR_IX ON PRODUCTS_test_qr
(PROD_SUBCATEGORY)
NOLOGGING
TABLESPACE EXAMPLE
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
NOPARALLEL;
CREATE INDEX PRODUCTS_PROD_CA_TEST_QR_IX ON PRODUCTS_test_qr
(PROD_CATEGORY)
NOLOGGING
TABLESPACE EXAMPLE
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
NOPARALLEL;
ALTER TABLE PRODUCTS_test_qr ADD (
CONSTRAINT PRODUCTS_TEST_QR_PK
PRIMARY KEY
(PROD_ID)
USING INDEX
TABLESPACE EXAMPLE
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
));
INSERT INTO PRODUCTS_TEST_QR select * from products;
------ 建立fact所對應的VIEW:
CREATE view sales_view as select * from sales;
------ 注意,在view上建立外來鍵,透過trigger控制pf約束;
alter view sales_view add constraint product_vw_fk foreign key (PROD_ID) references PRODUCTS_TEST_QR (PRODUCTS_TEST_QR_PK) disable;
alter view sales_view add constraint time_vw_fk foreign key (TIME_ID) references TIMES (TIME_ID) disable;
ALTER VIEW sales_view MODIFY CONSTRAINT product_vw_fk RELY;
ALTER VIEW sales_view MODIFY CONSTRAINT time_vw_fk RELY;--( Rely為了在query_rewrite_integrity為trust和stale_tolerated的情況下能夠rewrite)
--- 建立mv的基表:
CREATE TABLE SUM_SALES_TEST_QR_MV
(
PROD_SUBCATEGORY VARCHAR2(50 BYTE) NOT NULL,
WEEK_ENDING_DAY DATE NOT NULL,
SUM_AMOUNT_SOLD NUMBER
)
TABLESPACE USERS
PCTUSED 0
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;
CREATE UNIQUE INDEX I_SNAP$_SUM_SALES_TEST_QR_WE ON SUM_SALES_TEST_QR_MV
(SYS_OP_MAP_NONNULL("PROD_SUBCATEGORY"), SYS_OP_MAP_NONNULL("WEEK_ENDING_DAY"))
LOGGING
TABLESPACE USERS
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
BUFFER_POOL DEFAULT
)
NOPARALLEL;
--- 建立新的MV :SUM_SALES_TEST_QR_MV
DROP MATERIALIZED VIEW SUM_SALES_TEST_QR_MV;
CREATE MATERIALIZED VIEW SUM_SALES_TEST_QR_MV
ON PREBUILT TABLE
REFRESH FORCE ON DEMAND
ENABLE QUERY REWRITE
AS
SELECT p.prod_subcategory, t.week_ending_day,
sum(s.amount_sold) AS sum_amount_sold
FROM sales_view s, PRODUCTS_TEST_QR p, times t
where s.time_id = t.time_id and s.prod_id = p.prod_id
group by p.prod_subcategory, t.week_ending_day;
################### test Rewrite:
1. 測試sales_view與products_test_qr的查詢:
explain plan for
SELECT p.prod_subcategory,
sum(s.amount_sold) AS sum_amount_sold
FROM sales_view s, products_test_qr p
where s.prod_id = p.prod_id
group by p.prod_subcategory;
------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 40 | 3 (34)| 00:00:01 |
| 1 | HASH GROUP BY | | 1 | 40 | 3 (34)| 00:00:01 |
| 2 | MAT_VIEW REWRITE ACCESS FULL| SUM_SALES_TEST_QR_MV | 1 | 40 | 2 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------
2. 測試sales_view與Times的查詢:
explain plan for
SELECT t.week_ending_day,
sum(s.amount_sold) AS sum_amount_sold
FROM sales_view s, times t
where s.time_id = t.time_id
group by t.week_ending_day;
------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 22 | 3 (34)| 00:00:01 |
| 1 | HASH GROUP BY | | 1 | 22 | 3 (34)| 00:00:01 |
| 2 | MAT_VIEW REWRITE ACCESS FULL| SUM_SALES_TEST_QR_MV | 1 | 22 | 2 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------
以上結果證明view也可以做query rewrite, 但前提dimension要不同;
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/661919/viewspace-1008098/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 得到VIEW的定義語法View
- SQL語句中NULL的真實含義SQLNull
- 查詢語句中escape的轉義字元字元
- 子查詢包含where ..or在Corelated Subquery 中語句中問題
- mv(materialized view)的一點測試ZedView
- 建立物化檢視MV ( Materialized View )ZedView
- 前端MV*框架的意義前端框架
- nginx的rewrite設定Nginx
- sql語句中as的用法SQL
- 判斷SQL語句中是否包含中文、英文字元和數字SQL字元
- Oracle的語句中的提示Oracle
- 【VIEW】Oracle如何查詢固定檢視的定義或底層sql語句ViewOracleSQL
- sql語句中JOIN ON 的使用SQL
- MV (Materialed View) 物化檢視的重新整理組View
- sql語句中#{}和${}的區別SQL
- sql語句中as的用法和作用SQL
- sql語句中select……as的用法SQL
- nginx rewrite語法格式Nginx
- 軟體定義無線電能否成為現實?
- Android自定義View之定點寫文字AndroidView
- SQL語句中exists和in的區別SQL
- SQL語句中not in 和not exist的區別SQL
- sql語句中as的意思是什麼SQL
- 在sql語句中替換Not In 的方法SQL
- sql語句中常量的處理SQL
- c語言的定義與宣告C語言
- drools中Fact的equality modes
- Android 自定義 View:包含多種狀態的下載用圓形進度條AndroidView
- SQL 語句中關於 NULL 的那些坑SQLNull
- 總結SQL語句中的優化提示SQL優化
- oracle 動態語句中的returning用法Oracle
- C語言(巨集定義)C語言
- 自定義VIEWView
- SQL語句中SELECT語句的執行順序SQL
- c 語言中巨集定義和定義全域性變數的區別變數
- Android自定義View:View(二)AndroidView
- mysql 還原表的定義語句MySql
- Android自定義View:MeasureSpec的真正意義與View大小控制AndroidView