oracle筆記整理10——性能調優之臨時表與物化視圖

1. 臨時表

1) 概念

a) 臨時表跟永久表最大的區別就是表中的數據不會永遠的存在

b) Oracle臨時表分爲會話級臨時表和事務級臨時表。

c) 會話臨時表,結束或中斷會話時清空數據。

create global temporary table XXX()
on commit preserve rows;

d) 事務臨時表,commit之後清空數據。

on commit delete rows;

2) 原理

a) 臨時表不會爲它們的塊生成redo。因此,對臨時表的操作不是“可恢復的” 。修改臨時表中的一個塊時,不會將這個修改記錄到重做日誌文件中。不過,臨時表確實會生成 undo,而且這個 undo 會計入日誌。因此,臨時表也會生成一些redo。

b) 這是因爲你能回滾到事務中的一個 SAVEPOINT。由於undo數據必須建立日誌,因此臨時表會爲所生成的undo生成一些重做日誌。這樣似乎很糟糕。但是,在臨時表上運行的 SQL 語句主要是 INSERT 和SELECT。幸運的是,INSERT 只生成極少的 undo(需要把塊恢復爲插入前的“沒有”狀態,而存儲“沒有”不需要多少空間),另外SELECT根本不生成undo。

c) Oracle的臨時表還保證了多用戶操作的獨立性:對於使用同一張臨時表的不同用戶,ORACLE都會分配一個獨立的Temp Segment,這樣就避免了多個用戶在對同一張臨時表操作時發生交叉,從而保證了多個用戶操作的併發性和獨立性;

3) 應用優化

a) 當多表關聯,且存在小表時。可以採用將大表關聯得到比較小的結果集合存放在臨時表中,再用臨時表去關聯小表。

b) 如果某個數據集在這個會話期間需多次使用,建議使用臨時表。

2. 物化視圖

1) 概念

視圖是一個虛擬表(也可以認爲是一條語句),基於它創建時指定的查詢語句返回的結果集。每次訪問它都會導致這個查詢語句被執行一次。爲了避免每次訪問都執行這個查詢,可以將這個查詢結果集存儲到一個物化視圖(也叫實體化視圖)。

2) 類型

物化視圖的類型:ON DEMAND、ON COMMIT

a) on demand
根據需要(ON DEMAND):物化視圖會在顯式請求的情況下進行刷新(可以通過手工調用,也可以通過運行按照指定的時間間隔的任務)。這意味着從基礎表修改到物化視圖刷新這段時間內,物化視圖中可能包含失效的數據。

b) on commit
在提交時(ON COMMIT):物化視圖會在基礎表修改所在的同一個事務裏進行自動刷新,也就是說,物化視圖總是包含最新的數據;(這種方式比較少用)

3) 刷新

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

b) 快速刷新(FAST)
採用增量刷新的機制,只將自上次刷新以後對基表進行的所有操作刷新到物化視圖中去。

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

4) 語法

create materialized view view_name
refresh [fast|complete|force]
[
on [commit|demand] |
start with (start_time) next (next_time)

]
AS subquery;

5) 示例

a) 創建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進行刷新 

b) 修改刷新時間:

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點刷新
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章