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

thinkpadshi發表於2016-01-14

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點重新整理

相關文章