視圖是一個虛表,不佔用物理空間,由於視圖自己的定義語句存儲在數據字典裏。視圖中的數據是從一個或多個實際的表中得到。sql
物化視圖:也成實體化視圖,含有實際數據,佔用存儲空間,在數據倉庫中常常應用物化視圖oracle
建立視圖的語法ide
CREATE [OR REPLACE] [FORCE |NO FORCE] VIEWview_name [(alias [,alias]..)] as select_statement [WITH CHECK_OPTION[CONSTRAINT constraint]] [WITH READ ONLY];函數
在語法中優化
OR REPLACE:若是視圖已經存在,此選項將從新建立該視圖。ui
FORC:若是使用此關鍵字,則不管基表是否存在,都將建立視圖3d
NO FORCE:這是默認值,若是使用此關鍵字,則僅當基表存在時才建立視圖日誌
VIEW_NAME:要建立的視圖名code
ALIAS:指定由視圖的查詢所選擇的的表達式或列的別名。別名的數目必須與視圖所選擇的的表達式的數據相匹配。blog
select_statement:SELECT 語句
WITH CHECK_OPTION:此選項指定只能插入或更新視圖能夠訪問的行,constraint標識CHECK OPTION約束指定的名稱
WITH READ ONLY:此選項保證不能再視圖上執行任何修改操做。
建立帶有錯誤的視圖
若是在CREATE VIEW語法中使用FORCE選項,即便存在如下狀況,也會建立視圖
視圖定義的查詢引用了一個不存在的表
視圖定義的查詢引用了現有表中無效的列。
視圖的全部者沒有所需的權限。
在這些狀況下,oracle僅檢查CREATE VIEW語句中語法錯誤,若是語法正確,將會建立視圖,並將視圖的定義存儲在數據字典中,可是該視圖卻不能使用。這種視圖被認爲是帶有錯誤建立的。能夠用SHOW ERRORS VIEW視圖名來查看錯誤
對單表的視圖操做
SQL> create table order_master (ordernonumber(5) CONSTRAINT p_ord PRIMARY KEY,
2 odate DATE,vencode number(5),
3 o_status char(1));
插入數據
SQL> insert into order_master values (1,to_date('2010-01-01','yyyy-mm-dd'),1,'a');
SQL> insert into order_master values(2,to_date('2011-01-01','yyyy-mm-dd'),2,'p');
建立訂單狀態爲"p"的視圖,提示沒有建立視圖的權限
授予SCOTT用戶建立視圖的權限
建立視圖
SQL> create view pen_view as select *from order_master where o_status = 'p';
查詢視圖
經過視圖修改數據,將狀態爲「p」的訂單修改成「d」
SQL> update pen_view SET o_status='d'where o_status='p';
若是修改爲功,在查詢視圖將查詢不出任何記錄,由於修改了建立視圖是做爲條件的列
爲了不修改視圖後查詢不到記錄的現象,使用with check option語句建立檢查約束以防止上述狀況的發生,同時可使用CONSTRAINT指定約束名稱
SQL> create or replace view pen_view asselect * from order_master where o_status='p'
2 with check option constraintpenv;
更新視圖
SQL> update pen_view set o_status='d'where o_status='p';
提示with check option違反where子句
建立只讀視圖
SQL> create or replace view pen_view asselect * from order_master with read only;
查看視圖
爲視圖插入記錄
建立帶有錯誤的視圖
由於不存在venmast表
建立表venmast
SQL> create table venmast (id int);
手動編譯剛纔建立的錯誤視圖
查看視圖
建立帶ORDER BY子句的視圖
SQL> create or replace view pen_view asselect * from order_master order by orderno;
複雜視圖
DML語句是指用於修改數據的INSERT,DELETE,UPDATE語句。由於視圖是一個虛表,因此這些語句也能夠與視圖一同使用。通常狀況下不經過視圖修改數據,而是直接修改基本表,由於這樣調理更清晰。在視圖上使用DML語句有以下限制:(相對於表)
DML語句只能修改視圖中的一個基表
若是對記錄的修改違反了基表的約束條件,則將沒法更新視圖
若是建立的視圖包含鏈接運算符,DISTINCT運算符,集合運算符,聚合函數和group BY子句,則將沒法更新視圖。
若是建立的視圖包含僞列或表達式,則將沒法更新視圖。
簡單視圖基於單個基表,不包括函數和分組函數,那麼能夠在此視圖中進行INSERT,UPDATE,DELETE操做。這些操做其實是在基表中插入、更新和刪除行。
複雜視圖從多個提取數據,包括函數和分組函數,複雜視圖不必定能進行DML操做。
刪除視圖可使用
物化視圖
物化視圖是和普通視圖相對應的,在oracle使用普通視圖時,它會重複執行建立視圖的全部sql語句,若是這樣的SQL語句含有多張表的鏈接或者ORDER BY子句,並且表的數據量很大,則會很是耗時,效率很是低下。爲了解決這個問題,oracle提出了物化視圖的概念
物化視圖就是具備物理存儲的特殊視圖,佔用物理空間,就象表同樣,物化視圖是基於表,物化視圖等建立的。它須要和源表進行同步,不斷的刷新物化視圖中的數據。物化視圖有兩個重要概念:查詢重寫和物化視圖的同步
查詢重寫:
對SQL語句進行重寫。當用戶使用SQL語句對基表進行查詢時,若是已經創建了基於這些基表的物化視圖,oracle將自動計算和使用物化視圖來完成查詢,在某些狀況下能夠節約查詢時間,減小系統I/O。這種查詢優化技術成爲查詢重寫。參數QUERY_REWRITE_ENABLED決定是否使用重寫查詢。在建立物化視圖時須要使用ENABLE QUERY REWRITE來啓動查詢重寫功能
可經過SHOW命令查看該參數的值
物化視圖的同步:
物化視圖是基於表建立的,因此當基表發生變化時,須要同步數據以更新物化視圖中的數據,這樣保持無話視圖中的數據和基表的數據的一致性。oracle提供了兩種物化視圖刷新方式
ON COMMIT:指物化視圖在對基表的DML操做事物提交的通行進行刷新
ON DEMAND:指物化視圖在用戶須要的時候進行刷新,能夠手工經過DBMS_IVIEW.refresh等方法來進行刷新,也能夠經過JOB定時刷新
選擇刷新方式後,還須要選擇一種刷新類型,刷新類型值刷新時基表與物化視圖如何實現數據同步,oracle提供了一下4種刷新類型:
COMPLETE:對整個物化視圖進行徹底刷新。
FAST:採用增量刷新,只刷新自上次刷新之後進行的修改
FORCE:oracle在刷新會判斷是否能夠進行快速刷新,若是能夠則採用FAST刷新方式,不然使用COMPLETE方式。
NEVER:物化視圖不進行任何刷新
建立物化視圖
建立物化視圖的前提條件:
具有建立物化視圖的權限,QUERY REWRITE的權限,以及對建立物化視圖所涉及的表的訪問權限和建立表的權限
使用SCOTT用戶來舉例說明
1.授予相應的權限
SQL> show user;
USER is "SYS"
SQL> grant create materialized view toscott;
SQL> grant query rewrite to scott;
SQL> grant create any table to scott;
SQL> grant select any table to scott;
2.建立物化視圖日誌
物化視圖日誌是用戶選擇了FAST刷新類型時須要使用的,以增量同步基表的變化。
對SCOTT用戶的EMP表和DEPT表建立物化視圖,因此對這兩個基表建立物化視圖日誌
SQL> create materialized view log ondept with rowid;
SQL> create materialized view log on empwith rowid;
建立物化視圖
經過CREATE MATERIALIEZED VIEW語句來建立物化視圖,
SQL> create materialized viewmtrlview_test
2 build immediate
3 refresh fast
4 on commit
5 enable query rewrite as
6 selectd.dname,d.loc,e.ename,e.job,e.mgr,e.hiredate,e.sal,d.rowid d_rowid,e.rowide_rowid
7 from dept d,emp e whered.deptno=e.deptno;
其中:
BUILD IMMEDIATE:該參數的意思是當即建立物化視圖;也能夠選擇BUILD DEFFERED,該參數說明在物化視圖定義之後不會當即執行,而是延遲執行,在使用該視圖在建立。
REFRESH FAST:刷新數據的類型選擇FAST類型
ON COMMIT:在基表有更新時提交後當即更新物化視圖
ENABLE QUERY REWRITE :啓動查詢重寫功能,在建立物化視圖是明確說明啓用查詢重寫功能。
AS:定義後面的查詢語句
查詢體:物化視圖的查詢內容。該SQL語句的查詢結果集輸出到物化視圖中,保存在由oracle自動建立的表中。
刪除物化視圖
若是對此有興趣,請掃下面二維碼免費獲取更多詳情