您好,登錄后才能下訂單哦!
視圖是一個虛表,不占用物理空間,因為視圖本身的定義語句存儲在數據字典里。視圖中的數據是從一個或多個實際的表中獲得。
物化視圖:也成實體化視圖,含有實際數據,占用存儲空間,在數據倉庫中經常應用物化視圖
創建視圖的語法
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自動創建的表中。
刪除物化視圖
如果對此有興趣,請掃下面二維碼免費獲取更多詳情
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。