Oracle 11g R2 視圖

視圖是一個虛表,不佔用物理空間,由於視圖自己的定義語句存儲在數據字典裏。視圖中的數據是從一個或多個實際的表中得到。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));
Oracle 11g R2 視圖
插入數據

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');
Oracle 11g R2 視圖
建立訂單狀態爲"p"的視圖,提示沒有建立視圖的權限
Oracle 11g R2 視圖
授予SCOTT用戶建立視圖的權限
Oracle 11g R2 視圖
建立視圖

SQL> create view pen_view as select *from order_master where o_status = 'p';
Oracle 11g R2 視圖
查詢視圖
Oracle 11g R2 視圖
經過視圖修改數據,將狀態爲「p」的訂單修改成「d」

SQL> update pen_view SET o_status='d'where o_status='p';

Oracle 11g R2 視圖
若是修改爲功,在查詢視圖將查詢不出任何記錄,由於修改了建立視圖是做爲條件的列
Oracle 11g R2 視圖
爲了不修改視圖後查詢不到記錄的現象,使用with check option語句建立檢查約束以防止上述狀況的發生,同時可使用CONSTRAINT指定約束名稱

SQL> create or replace view pen_view asselect * from order_master where o_status='p'

2 with check option constraintpenv;
Oracle 11g R2 視圖
更新視圖

SQL> update pen_view set o_status='d'where o_status='p';
Oracle 11g R2 視圖
提示with check option違反where子句

建立只讀視圖
SQL> create or replace view pen_view asselect * from order_master with read only;
Oracle 11g R2 視圖
查看視圖
Oracle 11g R2 視圖
爲視圖插入記錄
Oracle 11g R2 視圖
建立帶有錯誤的視圖

Oracle 11g R2 視圖
由於不存在venmast表

建立表venmast

SQL> create table venmast (id int);

手動編譯剛纔建立的錯誤視圖
Oracle 11g R2 視圖
查看視圖
Oracle 11g R2 視圖
建立帶ORDER BY子句的視圖
SQL> create or replace view pen_view asselect * from order_master order by orderno;
Oracle 11g R2 視圖
複雜視圖
DML語句是指用於修改數據的INSERT,DELETE,UPDATE語句。由於視圖是一個虛表,因此這些語句也能夠與視圖一同使用。通常狀況下不經過視圖修改數據,而是直接修改基本表,由於這樣調理更清晰。在視圖上使用DML語句有以下限制:(相對於表)

DML語句只能修改視圖中的一個基表

若是對記錄的修改違反了基表的約束條件,則將沒法更新視圖

若是建立的視圖包含鏈接運算符,DISTINCT運算符,集合運算符,聚合函數和group BY子句,則將沒法更新視圖。

若是建立的視圖包含僞列或表達式,則將沒法更新視圖。

簡單視圖基於單個基表,不包括函數和分組函數,那麼能夠在此視圖中進行INSERT,UPDATE,DELETE操做。這些操做其實是在基表中插入、更新和刪除行。

複雜視圖從多個提取數據,包括函數和分組函數,複雜視圖不必定能進行DML操做。

刪除視圖可使用
Oracle 11g R2 視圖
物化視圖
物化視圖是和普通視圖相對應的,在oracle使用普通視圖時,它會重複執行建立視圖的全部sql語句,若是這樣的SQL語句含有多張表的鏈接或者ORDER BY子句,並且表的數據量很大,則會很是耗時,效率很是低下。爲了解決這個問題,oracle提出了物化視圖的概念

物化視圖就是具備物理存儲的特殊視圖,佔用物理空間,就象表同樣,物化視圖是基於表,物化視圖等建立的。它須要和源表進行同步,不斷的刷新物化視圖中的數據。物化視圖有兩個重要概念:查詢重寫和物化視圖的同步

查詢重寫:

對SQL語句進行重寫。當用戶使用SQL語句對基表進行查詢時,若是已經創建了基於這些基表的物化視圖,oracle將自動計算和使用物化視圖來完成查詢,在某些狀況下能夠節約查詢時間,減小系統I/O。這種查詢優化技術成爲查詢重寫。參數QUERY_REWRITE_ENABLED決定是否使用重寫查詢。在建立物化視圖時須要使用ENABLE QUERY REWRITE來啓動查詢重寫功能

可經過SHOW命令查看該參數的值
Oracle 11g R2 視圖
物化視圖的同步:

物化視圖是基於表建立的,因此當基表發生變化時,須要同步數據以更新物化視圖中的數據,這樣保持無話視圖中的數據和基表的數據的一致性。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;
Oracle 11g R2 視圖
SQL> create materialized view log on empwith rowid;
Oracle 11g R2 視圖
建立物化視圖

經過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;
Oracle 11g R2 視圖
其中:

BUILD IMMEDIATE:該參數的意思是當即建立物化視圖;也能夠選擇BUILD DEFFERED,該參數說明在物化視圖定義之後不會當即執行,而是延遲執行,在使用該視圖在建立。

REFRESH FAST:刷新數據的類型選擇FAST類型

ON COMMIT:在基表有更新時提交後當即更新物化視圖

ENABLE QUERY REWRITE :啓動查詢重寫功能,在建立物化視圖是明確說明啓用查詢重寫功能。

AS:定義後面的查詢語句

查詢體:物化視圖的查詢內容。該SQL語句的查詢結果集輸出到物化視圖中,保存在由oracle自動建立的表中。

刪除物化視圖
Oracle 11g R2 視圖
若是對此有興趣,請掃下面二維碼免費獲取更多詳情
Oracle 11g R2 視圖

相關文章
相關標籤/搜索