Oracle物化檢視3 - Prebuilt MV

chncaesar發表於2013-12-09

Oracle中,Prebuilt MV建立在同名的普通表上。Prebuilt MV的列是該同名表的列的一個子集。也就是說,該同名表可以包含不在MV中出線的列(Unmanaged columns)

MV重新整理時,這些列的值採用預設值。假如沒有定義預設值,這些列可以不能Not Null約束。


與普通物化檢視相比,Prebuilt MV提供的Query Rewrite功能有限。只有當Query_Rewrite_IntegritytrustedStale_Tolerated時,Prebuilt MV可以被Oracle Query Rewrite所使用。


與普通MV不同,當使用者刪除(Drop)MV時,該同名表不會被刪除。在建立了Prebuilt MV後,該同名表不能用drop table xxx語句刪除。


下面是Oracle自帶SH Schema中一個Prebuilt MV的例子:

CREATE MATERIALIZED VIEW CAL_MONTH_SALES_MV

ON PREBUILT TABLE

USING INDEX

REFRESH ON DEMAND

FORCE

USING DEFAULT LOCAL ROLLBACK SEGMENT

ENABLE QUERY REWRITE AS

SELECT   t.calendar_month_desc

  ,        sum(s.amount_sold) AS dollars

  FROM     sales s

  ,        times t

  WHERE    s.time_id = t.time_id

  GROUP BY t.calendar_month_desc;

當需要在MV裡新增一列時,普通物化檢視需要重建(drop materialized view, create materialized view),資料量大時,成本相當高。但是Prebuilt MV沒有這一缺陷。因為刪除物化檢視時,同名表仍然存在。下面給出一個例子:

desc cal_month_sales_mv
Name                Null     Type        
------------------- -------- ----------- 
CALENDAR_MONTH_DESC NOT NULL VARCHAR2(8) 
DOLLARS                      NUMBER 

Drop materialized view cal_month_sales_mv;
materialized view CAL_MONTH_SALES_MV dropped.

alter table cal_month_sales_mv add(quantity_sold number default 0);
table CAL_MONTH_SALES_MV altered.

CREATE MATERIALIZED VIEW CAL_MONTH_SALES_MV
ON PREBUILT TABLE
USING INDEX
REFRESH ON DEMAND
FORCE
USING DEFAULT LOCAL ROLLBACK SEGMENT
ENABLE QUERY REWRITE AS
SELECT   t.calendar_month_desc
  ,        sum(s.amount_sold) AS dollars
  , count(s.quantity_sold) as quantity_sold
  FROM     sales s
  ,        times t
  WHERE    s.time_id = t.time_id
  GROUP BY t.calendar_month_desc;
materialized view CAL_MONTH_SALES_MV created.

desc cal_month_sales_mv
Name                Null     Type        
------------------- -------- ----------- 
CALENDAR_MONTH_DESC NOT NULL VARCHAR2(8) 
DOLLARS                      NUMBER      
QUANTITY_SOLD                NUMBER   

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/638844/viewspace-1062829/,如需轉載,請註明出處,否則將追究法律責任。

相關文章