中物化視圖講解
中的物化視圖首先需要創建物化視圖日志,根據用戶創建的物化視圖日志來創建物化視圖日志表,物化視圖日志表名稱為mlog$_基表名,如果表名超過20位,則只取前20位,當截斷后名字有重復則加上序列號,以便區分。
物化視圖日志表介紹
物化視圖日志表創建選項:
創建物化視圖有多種選項類型,分別為 rowid , key和 id幾種類型,同時還可以指定 或明確指定列名,同時上面的幾種情況產生的物化視圖結構也各不相同。
物化視圖日志表公共的列
物化視圖無論哪種方式創建,都有幾個公共列,分別如下
$:用于表示刷新時間。當基本表發生dml操作時,會記錄到物化視圖中,這個時間是4000年1月1 日0時0分(表示物化視圖未被刷新)可更新的物化視圖,如果物化視圖日志供多個物化視圖使用,則第一個物化視圖刷新后它將刷新該記錄的時間為更新為刷新時間,只有建立快速刷新的物化視圖才能使用物化日志,如果只有一個物化視圖使用它,則物化視圖刷新完后會將物化日志清除掉
$:用于表示dml操作類型可更新的物化視圖,i表示,d表示,u表示。
$:用于表示這個值是新值還是舊值。n(ew)表示新值,o(ld)表示舊值,u表示操作。
$:表示修改矢量,用來表示被修改的是哪個或哪幾個字段
物化視圖日志表特殊列
如果使用with 則物化日志中包含主鍵字段
如果使用with rowid 則物化日志中包含m_row$ 表示發生的rowid
如過使用with id ,則物化視圖日中中會包含 $ 用來記錄每個變化對象的對象id
如果使用了 則物化視圖中會包含$,給每個操作分配一個,保證刷新時按照順序進行刷新
如果with后面跟了一個或多個名,則物化視圖中就會包含這些列
創建物化視圖日志表
1. key
drop table ;
TABLE
(
id (10) NOT NULL
, (20)
, (200)
);
alter table add key (id); --增加主鍵
drop view log on ;
view log on with key ;
desc mlog$;
使用 時,還會創建一個臨時表 rupd$_基礎表
2. rowid
drop table ;
TABLE
(
id (10) NOT NULL key
, (20)
, (200)
);
drop view log on ;
view log on with ROWID;
desc mlog$;
3.
創建類型
drop type ;
type as ( id (10), (20) , (200) );--創建類型
drop table ;
TABLE of ;
drop view log on ;
view log on with id;
desc mlog$;
4.
drop table ;
TABLE
(
id (10) NOT NULL
, (20)
, (200)
);
drop view log on ;
view log on with ;
直接用with 會創建失敗,錯誤信息 表 '' 不包含主鍵約束條件
view log on with (id,,) new ;
with 就算包含字段也會創建失敗,錯誤信息 表 '' 不包含主鍵約束條件
從上面看出 主鍵 、rowid、 id都是可以唯一標識行數據的,所有只用使用 是不能單獨使用來創建日志。
可以使用 主鍵+ 和 rowid+
5. 主鍵+
alter table add key (id); --增加主鍵
drop view log on ;
view log on with key, ;
desc mlog$;
drop view log on ;
將表的全部字段都記錄進去,這里 一定不要把主鍵字段名在寫入了,寫入會報錯
view log on with key, (,) new ;
desc mlog$;
6.rowid+
drop table ;
TABLE
(
id (10) NOT NULL
, (20)
, (200)
);
drop view log on ;
view log on with rowid,;
desc mlog$;
全部數據都加入日志表
drop view log on ;
view log on with rowid,(id,,) new ;
desc mlog$;
操作基本表查看日志表
基礎表:,,,(rowid+)
日志表:mlog$,mlog$,mlog$,mlog$
1.新增
into (1, 'a', '1a');
into (1, 'a', '1a');
into (1, 'a', '1a');
into (1, 'a', '1a');
;
2.修改
set = 'c' , ='cu' where id = 1;
set = 'c' , ='cu' where id = 1;
set = 'c' , ='cu' where id = 1;
set = 'c' , ='cu' where id = 1;
;
3.刪除
;
;
;
;
;
*from mlog$;
*from mlog$;
*from mlog$;
*from mlog$ ;
物化視圖
view []
build [|]
[fast||force]
[
on [|] |
start with () next ()
]
[ | ] query
as
{創建物化視圖用的查詢語句}
build [|]: 創建方式 默認 立即產生數據 根據需要產生數據
[fast||force]: 刷新方式 fast:增量刷新 :全部刷新 forc:這個是默認 刷新方式,當數據可以使用fast時候就使用fast,否則使用模式
on [|] :視圖數據刷新時間 事務提交時刷新 在用戶需要刷新時候刷新,這就要求用戶自己動手去刷新,或者定時job
start with () next (): 從指定時間開始每隔一段時間(由next指定)就刷新一次
[ | ] query : 查詢重寫,當對物化視圖的基表進行查詢時候,通過判斷分析是否能通過物化視圖來得到結果,如果可以則避免重新聚集 或其他操作,默認是的
使用主鍵 key 的物化日志表,只能創建單表查詢的物化視圖
view fast on as
* from ;
*from ;
如果我們將單表查詢修改成匯總類的如下
view fast as
, count(*) from group by ;
則報錯誤如下 RA-12032: 不能使用 ""."" 上實體化視圖日志中的 rowid 列
我們需要使用rowid的日志方式才能使用group 匯總類的物化視圖,我們使用來試下
使用rowid物化日志來創建帶有匯總的物化視圖
drop view ;
view fast as
, count(*) from group by ;
錯誤報告 -ORA-32401: ""."" 上的實體化視圖日志沒有新值
alter view log on add new ;
view fast as
, count(*) from group by ;
還是報錯,報錯信息如下
ORA-12033: 不能使用 ""."" 上實體化視圖日志中的過濾器列,我們需要添加列
alter view log on add()
view fast as
, count(*) from group by ;
現在可以成功的創建物化視圖了
rowid+ 模式日志也可以創建聚合類物化視圖
view fast as
, count(*) from group by ;
可以直接創建成功