默認的如果你創建了一個cube cube 裡面的數據只有在你手工執行
dbms_cubebuild(<cube_name>) 才會刷新
比如你在前面已經建立好了global 的price_cube 並且執行了第一次dbms_cubebuild(price_cube) 你才能查詢到數據 比如執行以下sql:
select * from table(cube_table(price_cube))
where product=ITEM_ENVY STD and time=MONTH_′;
此時輸出如下 (注意大小寫下劃線和空格):
unit_cost unit_price time product
MONTH_ ITEM_ENVY STD
現在我們手工更新price_fact 表的這條數據(price_cube 的實際數據來源)
update price_fact set unit_price=
where month_id= and item_id=ENVY STD;
rows updated
現在重新查看price_cube 的數據你會發現跟剛才的一樣 unit_price 還是等於 而不是隨著price_fact 表的數據更新到
啟用Cube MV 刷新數據的前提條件
如果你希望你的cube 隨著實體表的更新而刷新的話(不一定要是同步) 你就需要把cube 設置成按mv 方式來組織 不過首先你需要滿足以下幾個條件:
所有的dimension 必須至少有一個level 和 hierarchy
所有的dimension 必須使用同一種聚合操作 summinmax 等等
一個cube 的所有屬性必須正確的映射到實體表 一個cube 可以有calculated measures 但是不能映射到mv 如果一個cube 的腳本中有高級分析函數也不能映射
dimension 和fact table 之間必須要有約束至少是外鍵約束 如果你沒有定義你可以在啟用mv 的時候用Relational Schema Advisor 幫你映射
所有的表上的約束必須同一類型
cube 被壓縮了
為了更好的使用query rewrite 你應該創建relational dimension 對象
關於第二點otn 上給的global_schema 的price_cube 的聚合操作就不是同一的sum 操作所以你啟用mv 刷新的時候會報錯注意根據錯誤信息調整
關於第三點 calculated measure 支持的分析函數:
除了在第一個文件夾 簡單算術 文件夾下的六個(+×/%) 其他都算高級分析函數
關於第四點fact table 和dimension table 之間至少要有外鍵約束 這應該是建模標准之一如果不是多維數據集 比如g 之前的類型你可以方便的在外鍵之間建立組合索引 對於g 的cube 類型來說必須需要至少外鍵約束
關於第六點默認的用awm 創建的cube 裡面的是沒有指定壓縮類型和壓縮比率的只有在第一次刷新之後再啟用mv 刷新的時候才能選擇壓縮選項 awm 裡面有提示注意參考提示信息
關於第七點最重要 所謂relational dimension 就是我們通過create dimension 創建的對象 而我們之前說的dimension 一般都是指cube dimension 它指的是在analysis workspace 裡面的dimension 對象
relational dimension 你可以通過查看dba_dimensions 視圖查看 主要用來控制mv query rewrite 的
cube dimension 可以通過查看dba_cube_dimensions 視圖查看 另外兩個跟aw 相關的視圖是dba_cubes 和dba_aws
g 有一些新的跟aw 相關的試圖你可以查看
SELECT * FROM dba_objects WHERE object_name LIKE %AW%;
其中包括了dimension 和cube 的元數據dimension 和cube 的統計圖信息(analyze 之後收集的) dimension 和cube mv 的元數據 cube 的分區建議和儲存建議 具體查看oracle g 的文檔
默認的你創建cube 的時候它會創建對應的relational dimension (awm 裡面是這樣 手工從pl/sql 裡面創建沒試過) 你可以刪除relational dimension cube 裡面的dimension 是不會跟著刪除的
relational dimension的一些操作
查看dimension 的pl/sql
exec dbms_dimensiondescribe_dimension(globalproduct_dimension);
輸出:
DIMENSION GLOBALPRODUCT_DIMENSION LEVEL FAMILY IS GLOBALPRODUCT_DIMFAMILY_ID LEVEL ITEM IS GLOBALPRODUCT_DIMITEM_ID
LEVEL TOTAL IS GLOBALPRODUCT_DIMTOTAL_ID
LEVEL class IS GLOBALPRODUCT_DIMCLASS_ID
HIERARCHY primary ( ITEM CHILD OF
FAMILY CHILD OF
class CHILD OF
TOTAL
)
ATTRIBUTE FAMILY LEVEL FAMILY DETERMINES GLOBALPRODUCT_DIMFAMILY_DSC
ATTRIBUTE ITEM LEVEL ITEM DETERMINES GLOBALPRODUCT_DIMITEM_DSC
ATTRIBUTE TOTAL LEVEL TOTAL DETERMINES GLOBALPRODUCT_DIMTOTAL_DSC
ATTRIBUTE class LEVEL class DETERMINES GLOBALPRODUCT_DIMCLASS_DSC
啟用cube mv 刷新
實際啟用cube mv 刷新是很簡單的 主要是前提條件都滿足了 在awm 的cube 裡面Materialized Views 選項卡裡面點擊 Enable Materalized View 選項和 Enable Query Rewrite 選項
刷新模式有Complete Fast Force 其他可選方法還有PCT (Partition Change Tracking) 和Fast Solve;
Complete – 全部刪除再全部裝載
Fast – 使用mv log 記錄變化的記錄並且只更新這些記錄和對應的聚合記錄
Force 默認使用fast 如果fast 不可用才使用complete
Partition Change Tracking: 只刷新部分分區的數據這在awm 裡面沒有
Fast Solve: 加載所有的原始數據但是只計算新數據的聚合值awm 裡面沒有
mv 不會計算calculated measures 並且隨著mv 的體積增大創建和刷新的速度會變慢(不是呈線性下降)如果你mv 過大你應該考慮分割成幾個sub cube 或者去掉一些不用的屬性
你選擇使用mv 來刷新數據之後oracle 會為每一個dimension 的每個hierarchy 都創建一個mv 並且mv 的名字都是以CB$ 開頭 你是不能控制這些mv 的只能控制cube 以下的sql 可以得到所有的cube 對應的mv
啟用Query Rewrite
要使用query rewrite 必須滿足以下條件:
要有create mv 權限和其他相關對象的權限
在initora 文件中設置QUERY_REWRITE_ENABLED= TRUE 或FORCE 在session 裡面也可以
注意awm 裡面的檢查信息
注意查看Relational Schema Advisor 注意這很重要Relational Schema Advisor 在mv 選項卡的最下面上圖中最下面那個灰色的按鈕 裡面會列出你的schema 不符合query rewrite 的條件 它會給出sql 讓你執行注意查看這些sql 以避免query rewrite 失敗
你也可能會想要改變約束類型 從enforced trusted norely 到RELY 因為oracle執行計劃消耗會更小
alter table price_fact add constraint xxx_constraint PRIMARY KEY (ITEM_ID MONTH_ID UNIT_PRICE UNIT_COST) RELY enable validate ;
刷新MV
刷新時間點上有三種方式:
on demand 等待手工刷新
start next 定時到將來刷新
on commit 每次源表有提交都刷新
推薦的維護mv 刷新還是使用awm 如果是定時的話就使用下面一些pl/sql
exec dbms_cubebuild(PRICE_CUBE); — 這是全刷新
可以一句話包含多個cube 或dimension exec dbms_cubebuild(PRICE_CUBE xxx_CUBE xxx_dimension);
刷新mv:
exec dbms_mviewrefresh(CB$PRODUCT_PRIMARYC);
C 當然是代表complete 這會刷新所有跟這個dimension 的這個hierarchy 有關的mv
或者exec dbms_mviewrefresh(CB$PRICE_CUBEF) 這會以force 方式刷新這個cube 的它對應的mv
你可以說使用以下sql 查看mv 的狀態:
select owner||||mview_name cube_mv rewrite_enabled staleness
from all_mviews
where container_name like CB$%;
Staleness 這一欄下有fresh 和stale 兩種狀態fresh 表示所有數據都已經最新了 stale 表示有新的數據沒有刷新但是mv 仍然可用
MV 的一些注意事項
如果query rewrite 沒有使用mv 則檢查:
query_rewrite_enabled =FORCE
query_rewrite_integrity=stale_tolerated
使用dbms_mviewexplain_rewrite 查看為什麼query rewrite 沒有成功
From:http://tw.wingwit.com/Article/program/Oracle/201311/17187.html