1. 程式人生 > >Oracle 11g R2 視圖

Oracle 11g R2 視圖

ces key show vpd 參數說明 rom 狀態 刪除 還需

視圖是一個虛表,不占用物理空間,因為視圖本身的定義語句存儲在數據字典裏。視圖中的數據是從一個或多個實際的表中獲得。

物化視圖:也成實體化視圖,含有實際數據,占用存儲空間,在數據倉庫中經常應用物化視圖

創建視圖的語法

CREATE [OR REPLACE] [FORCE |NO FORCE] VIEWview_name [(alias [,alias]..)] as select_statement [WITH CHECK_OPTION[CONSTRAINT constraint]] [WITH READ ONLY];

在語法中

OR REPLACE:如果視圖已經存在,此選項將重新創建該視圖。

FORC:如果使用此關鍵字,則無論基表是否存在,都將創建視圖

NO FORCE:這是默認值,如果使用此關鍵字,則僅當基表存在時才創建視圖

VIEW_NAME:要創建的視圖名

ALIAS:指定由視圖的查詢所選擇的的表達式或列的別名。別名的數目必須與視圖所選擇的的表達式的數據相匹配。

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自動創建的表中。

刪除物化視圖
技術分享圖片
如果對此有興趣,請掃下面二維碼免費獲取更多詳情
技術分享圖片

Oracle 11g R2 視圖