ORACLE冷知識之同義詞、物化視圖

1、同義詞(SYNONYM)

數據庫有兩個用戶:u1 、u2 , u1用戶下有表info, 而此時u2 要操作u1.info,想簡潔點當操作自己表一樣,此時可創建同義詞,語法:CREATE [PUBLIC] SYNONYM 名 FOR object;

a、例:

grant select,insert,update,delete on u1.info to u2;

再切換到u2賬戶下建同義詞

create or replace synonym info for u1.info;

完成。在u2可以直接操作info表了。select * from info;

b、面試扯淡:

一、公用同義詞:能被所有的數據庫用戶訪問的同義詞,毫無疑問只有具有DBA權限的方案用戶才可以設置;需要具有CREATE PUBLIC SYNONYM權限;

二、私有同義詞:只能由創建的用戶訪問的同義詞;需要具有CREATE ANY SYNONYM權限;

如果存在私有同義詞和共有同義詞重名的狀況,那麼一般來說,Oracle採取就近原則,即採用私用同義詞來作為目標。建的同義詞不會佔用庫空間,只是在數據字典裡有定義而已。

2、物化視圖(materialized view)

有個項目因為有比較多的查詢彙總,考慮到速度,所以使用了物化視圖。簡單的把用到的給整理了下。

先看簡單創建語句:

create materialized view mv_materialized_test refresh force on demand start with sysdate next

to_date(concat(to_char( sysdate+1,'dd-mm-yyyy'),'10:25:00'),'dd-mm-yyyy hh24:mi:ss') as

select * from user_info; --這個物化視圖在每天10:25進行刷新

物化視圖也是種視圖。Oracle的物化視圖是包括一個查詢結果的數據庫對像,它是遠程數據的的本地副本,或者用來生成基於數據表求和的彙總表。物化視圖存儲基於遠程表的數據,也可以稱為快照。

物化視圖可以查詢表,視圖和其它的物化視圖。

特點:

(1) 物化視圖在某種意義上說就是一個物理表(而且不僅僅是一個物理表),這通過其可以被user_tables查詢出來,而得到確認;

(2) 物化視圖也是一種段(segment),所以其有自己的物理存儲屬性;

(3) 物化視圖會佔用數據庫磁盤空間,這點從user_segment的查詢結果,可以得到佐證;

創建語句:create materialized view mv_name as select * from table_name

因為物化視圖由於是物理真實存在的,故可以創建索引。

創建時生成數據:

分為兩種:build immediate 和 build deferred,

build immediate是在創建物化視圖的時候就生成數據。

build deferred則在創建時不生成數據,以後根據需要在生成數據。

如果不指定,則默認為build immediate。

刷新模式:

物化視圖有二種刷新模式:

在創建時refresh mode是 on demand 還是 on commit。

on demand 顧名思義,僅在該物化視圖“需要”被刷新了,才進行刷新(REFRESH),即更新物化視圖,以保證和基表數據的一致性;

on commit 提交觸發,一旦基表有了commit,即事務提交,則立刻刷新,立刻更新物化視圖,使得數據和基表一致。一般用這種方法在操作基表時速度會比較慢。

創建物化視圖時未作指定,則Oracle按 on demand 模式來創建。

上面說的是刷新的模式,針對於如何刷新,則有三種刷新方法:

完全刷新(COMPLETE): 會刪除表中所有的記錄(如果是單表刷新,可能會採用TRUNCATE的方式),然後根據物化視圖中查詢語句的定義重新生成物化視圖。

快速刷新(FAST): 採用增量刷新的機制,只將自上次刷新以後對基表進行的所有操作刷新到物化視圖中去。FAST必須創建基於主表的視圖日誌。對於增量刷新選項,如果在子查詢中存在分析函數,則物化視圖不起作用。

FORCE方式:這是默認的數據刷新方式。Oracle會自動判斷是否滿足快速刷新的條件,如果滿足則進行快速刷新,否則進行完全刷新。

關於快速刷新:Oracle物化視圖的快速刷新機制是通過物化視圖日誌完成的。Oracle通過一個物化視圖日誌還可以支持多個物化視圖的快速刷新。物化視圖日誌根據不同物化視圖的快速刷新的需要,可以建立為ROWID或PRIMARY KEY類型的。還可以選擇是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

查詢重寫(QueryRewrite):

包括 enable query rewrite 和 disable query rewrite 兩種。

分別指出創建的物化視圖是否支持查詢重寫。查詢重寫是指當對物化視圖的基表進行查詢時,oracle會自動判斷能否通過查詢物化視圖來得到結果,如果可以,則避免了聚集或連接操作,而直接從已經計算好的物化視圖中讀取數據。

默認為disable query rewrite。

語法:

create materialized view view_name

refresh [fast|complete|force]

[

on [commit|demand] |

start with (start_time) next (next_time)

]

AS subquery;

具體操作

創建物化視圖需要的權限:

grant create materialized view to user_name;

在源表建立物化視圖日誌:

create materialized view log on test_table

tablespace test_space -- 日誌空間

with primary key; -- 指定為主鍵類型

在目標數據庫上創建MATERIALIZED VIEW:

create materialized view mv_materialized_test refresh force on demand start with sysdate next

to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),'10:25:00'),'dd-mm-yyyy hh24:mi:ss') as

select * from user_info; --這個物化視圖在每天10:25進行刷新

修改刷新時間:

alter materialized view mv_materialized_test refresh force on demand start with sysdate

next to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 23:00:00'),'dd-mm-yyyy hh24:mi:ss');

alter materialized view mv_materialized_test refresh force on demand start with sysdate

next trunc(sysdate,'dd')+1+1/24; -- 每天1點刷新

建立索引:

create index IDX_MMT_IU_TEST

on mv_materialized_test(ID,UNAME)

tablespace test_space;

刪除物化視圖及日誌:

drop materialized view log on test_table; --刪除物化視圖日誌:

drop materialized view mv_materialized_test; --刪除物化視圖

源自 https://blog.csdn.net/qq_26941173/article/details/78529041


分享到:


相關文章: