<轉>oracle效能調整讀書筆記(2)

wuhesheng發表於2009-07-16
 

第三章 SQL 調整 3. 穩定執行計劃 xV&c ) l>}
!^{0vF WE
> W fkWUb
改善應用程式效能 [{]/9E /&
包括兩個方面:改進執行路徑(穩定執行計劃,物化檢視)和最小化IO(索引,分割槽, 簇); [D !-~ ]5
xLxXc!{J5
穩定執行計劃 V}?*kx~T2C
· 可以用儲存在OUTLN方案的公共大綱或者儲存在本方案的私有大綱來穩定某些SQL語句的執行計劃,這樣這些語句的執行計劃就不會因為統計資料或者會話優化模式的改變而發生改變; Z>0a?=1[
· 建立大綱時可以指定類別,預設的類別是DEFAULT; I4 [ sf
· 建立大綱時,是將SQL當前的執行計劃和SQL文字一起儲存起來; h( M_ K
· 啟用大綱有三種方式,SQL文字和大綱完全一致時才會使用大綱中儲存的執行計劃; fN)A`>iP
Ø 在引數檔案中加上USE_STORED_OUTLINES=TRUE )4nf={ iM
Ø ALTER SYSTEM SET USE_STORED_OUTLINES={TRUE | FALSE | category_name}; #6fQ$x(F#j
Ø ALTER SESSION SET USE_STORED_OUTLINES={TRUE | FALSE | category_name}; % A q t0e
· 當SQL語句執行時,ORACLE確定執行計劃是按下面的順序進行的,檢查共享池中是否有可用的大綱 à 檢查字典中是否有可用的大綱à 檢查共享池中是否有可共用的已解析SQL à 考查優化模式和相關統計產生並選擇最優的執行計劃,前面三種情形下都有現成的執行計劃; kGz0`8U Ru
· 相關的資料字典檢視有:DBA_OUTLINES, DBA_OUTLINE_HINTS。 !?AgA sSmc
bD2):U*Fzo
O V" 5:){
第三章 SQL 調整 4. 物化檢視 *KMW 6dg;
sKg IKYG}T
\ GF 9;N}V
· 物化檢視用資料段儲存預連線,預彙總的查詢資料,物化檢視可以有索引,也可以分割槽,物化檢視主要應用於資料倉儲和決策支援系統; _?}[7K! ~d
· 建立物化檢視時需考慮以下因素: Ii .0B ul
1. 確定檢視語句,是何種連線,何種彙總;可以藉助Summary Advisor來確定最佳的物化檢視SQL語句,並檢查已建立物化檢視的使用情況;
2. 確定重新整理方式:NEVER REFRESH(不重新整理),REFREST FAST(藉助物化檢視日誌,只檢查自上次重新整理後改變了的資料來進行重新整理), REFRESH COMPLETE(先清除,再重灌資料), REFRESH FORCE(先試圖用FAST方式重新整理,如果失敗再用COMPLETE方式重新整理,這是預設的重新整理方式); J<9; Ix 8R
3. 確定重新整理時機:ON COMMIT(事務提交時重新整理), ON DEMAND(用DBMS_MVIEW.REFRESH, DBMS_MVIEW.REFRESH_DEPENDENT, DBMS_MVIEW.REFRESH_ALL_MVIEWS來手工重新整理), By Time(用START WITH 和 NEXT 子句建立的job來定時自動重新整理); Fkv f[!Ci
4. 建立方式:BUILD IMMEDIATE(立即生成資料), BUILD DEFERRED(下一次重新整理時生新資料), ON PREBUILD TABLE(不建立新的資料段,用已存在的含有當前物化檢視資料的表來代替); _{ C =d 3
5. ENABLE | DISABLE QUERY REWRITE指定是否啟用當前物化檢視用於查詢重寫,啟用該選項時,系統會檢查以保證查詢的可確定性(不允許有如序列數,USER, DATE等不確定的返回值),DISABLE時物化檢視照樣可以被重新整理; , hVDGif
z +5% .^Re
· 與物化檢視生效相關的設定 A xAb U7m
1. 初始化引數JOB_QUEUE_PROCESSES設定大於零,物化的自動重新整理操作需要JOB QUEUE程式來執行; PNp -/1 Cx
2. 初始化引數OPTIMIZER_MODE要設成某種CBO優化模式; Zs to8wuf#
3. 使用者會話有QUERY_REWRITE(優化器能將查詢重寫到本方案物化檢視)或GLOBAL_QUERY_REWRITE(優化器能將查詢重寫到其它方案的物化檢視)系統許可權; F @l d#O
4. 初始化引數QUERY_REWRITE_ENABLED 指示優化器是否動態重寫查詢來使用物化檢視,這個引數可以在四個級別上進行設定(引數檔案,ALTER SYSTEM, ALTER SESSION, HINTS); o: c : hSV
5. 初始化引數QUERY_REWRITE_INTEGRITY 指示優化器在不同的資料一致性情況下決定是否使用物化檢視來重寫查詢,ENFORCED(只有在能確保資料一致的前提下才使用物化檢視), TRUSTED(資料不一定一致,只要有用維度物件定義的關係存在,就可使用物化檢視), STALE_TOLERATED(資料不一致,也沒有相關的維度定義時仍可使用物化檢視),這個引數可以在三個級別上進行設定(引數檔案,ALTER SYSTEM, ALTER SESSION);

第三章 SQL 調整 5.索引 x0||' 0I0
|l Mc6C
>)ed ha*W]
索引 @ ;7Ht Z`
ORACLE 9i 中有六種索引:二叉樹索引,壓縮的二叉樹索引,點陣圖索引,基於函式的索引,反向索引,索引組織表; +c tJV>
,!QtVi A7
二叉樹索引 b !T-{Ns6
· 二叉樹索引將索引欄位值和ROWID一起儲存樹狀結構中,適用於只存取表中總記錄的5%以下的查詢; \u*[mrX_B:
· 出現在SQL的WHERE條件中,集勢高的欄位適於當作索引欄位; ;v 5Jps2^]
· 隨著基表資料的不斷增加,索引塊會不斷分裂以保持二叉樹的平衡,樹的層次(從根結點訪問到葉結點要經過的資料塊數,DBA_INDEXES.BLEVEL)也不斷增加,層次大於4的索引宜重建; \ t]_UNGyW
· 基表資料刪除時,索引項也隨之刪除,但葉塊上的空間並不能被重用,除非該葉塊上所有的索引項都被刪除,當刪除項佔所有項超過20%時,這個索引也需要重建(ANALYZE INDEX … VALIDATE STRUCTURE;分析索引後檢視index_stats.del_lf_rows_len 和 index_stats.lf_rows_len 可以知道被刪除的索引項佔用的空間和所有葉行佔用的空間); W?ge lu ]
· 有三種重建索引的方法: iCy $ rC
1. 先刪除再重建;這種方法耗費最多的資源,是早期版本的唯一方法; q> m [vvt"
2. ALTER INDEX … REBUILD; 這種方法高效快速,但需要額外的磁碟空間;用這種方法可以指定許多選項如ONLINE(線上重建可減少鎖爭用), TABLESPACE(移動段到其它表空間), COMPUTE STATISTICS(統計), PARALLEL(並行), NOLOGGING(儘可能少地產生日誌); {j %7/T{
3. ALTER INDEX … COALESCE; 這種方法快速,無需額外空間,鎖爭用也少,缺點是選項少。 ( H -kW T
@ ; Xa&*
壓縮的二叉樹索引 vP ^ V 3
· 壓縮的二叉樹索引對重複的索引鍵值只儲存一次,後跟所有的有這個鍵值行的ROWID; aK-- D2@}i
· 有兩種方法建立: s,~g| I\
1. CREATE INDEX … COMPRESS; L/)Q 1Mm
2. 先建立普通索引,再更改:CREATE INDEX …; ALTER INDEX … COMPRESS; J#?z/3 v(
BO'7c 1FU
點陣圖索引 Sw` +4 4
· 點陣圖索引適於建立在資料相對穩定的表的低集勢欄位上; s/ Q8(sF5
· 點陣圖索引針對每一個鍵值建立一個二進位制點陣圖,點陣圖中的每位對應表中的一行,1表示這一行是當前鍵值,0表示這一行為其它鍵值; KdC '#$
· 與二叉樹索引相比,點陣圖索引佔的空間很少,如果WHERE條件中出現同一表的多個點陣圖索引欄位時,無論是AND或是OR操作,都能用點陣圖合併操作快速地定位到ROWID; j>#ywh*A
· 當基表上有DML操作時,整個點陣圖都會被鎖住,但是,每一個DML操作,點陣圖只需更新一次; =2 1m| 8c
· 相關引數: !wH' dsriD
1. SORT_AREA_SIZE 建立索引排序點陣圖欄位和ROWID時會用到; _J>!K'Dz
2. PGA_AGGREGATE_TARGET 建立點陣圖索引以及點陣圖合併時會用到; z~# d@c \
3. CREATE_BITMAP_AREA_SIZE, BITMAP_MERGE_AREA_SIZE 這是8i的兩個與點陣圖建立和合並有關引數,在9i建議不再使用。 ?7TuE!!M
KU ;J2Kt
基於函式的索引 o T "7O 5v
· 當欄位以函式表示式的形式出現在WHERE條件中,基於這些欄位的索引不會被優化器用到,除非是基於這些欄位的函式索引; = ,Z5F`d 4
· 要建立基於函式的索引需要QUERY REWRITE 或 GLOBAL QUERY REWRITE系統許可權,有CREATE ANY INDEX許可權是不行的; >9t+lr1
· 要想優化器使用基於函式的索引,OPTIMIZER_MODE必須設成某種CBO模式,QUERY_REWRITE_ENABLED須設成TRUE(這點從試驗中無法證明,設成FALSE似乎也能用到函式索引)。 Q$ A;Fk}-
l fqsoIn;
反向索引 Nh1 , w
· 反向索引是建立在索引欄位值的反向值上的,可以使相臨的記錄在索引段裡變得離散,可以減少某些DML操作引發的塊競爭; X 1}U
· 反向索引多建立在用序列號生成的欄位上,這樣的欄位在普通索引中容易形成更多的層(設計過一些試驗,但一直未觀察到這種現象); / @0
· 有兩種產生方法:CREATE INDEX … REVERSE; ALTER INDEX … REVERSE; lV gin5 4Q
· 反向索引適於WHERE中的等於或不等於的比較,對於範圍查詢(>,< between)是無能為力的。 6NG QU%H d
Og?P5&C"9D
索引組織表 J/\^ 3r CB
· 前面五種索引的基表資料儲存是隨機的,這種表稱為堆表; spT I hZ
· 索引組織表的資料儲存在二叉樹索引中,所以,如果通過主鍵來存取資料,索引組織表能更快地返回資料,因為不需要先取索引塊再取資料塊,可以直接從索引中返回資料; \{ff7_mLo
· 建立索引組織表時必須指定一個主鍵欄位,用這個作為索引; C W?R7A/
· 索引組織表上不能建唯一約束,也不能將索引組織表建立在簇上面; )V9 wU1.
· 索引組織表的語法要點: o Fp4*
Ø ORGANIZATION INDEX 指明當前表是索引組織表; z W* Z
Ø PCTTHRESHOD 後跟一個0到50的數,預設值為50,指明容納一行資料可用使塊空間的百分比; P F0AU T
Ø INCLUDING 後跟一個欄位,如果資料行的長度超過了PCTTHRESHOLD指定的可用空間,從這個欄位之後將資料行分為兩段,後面的部分放入溢位段中; rM)#}eZ K!
Ø OVERFLOW TABLESPACE 指定溢位段所在的表空間; DVw 04ay%
Ø MAPPING TABLE 當在索引組織表上建立點陣圖索引時建立關聯的對映表;堆表點陣圖索引的每個位對應到表的一個ROWID,索引組織表的ROWID會隨著索引的分裂而發生改變,如果和堆表一樣處理,點陣圖索引很容易就失效或者維護成本很高,對映表就是為解決這個問題而引入的,對映表存放索引組織表的ROWID和邏輯行間的對應關係,索引點陣圖中的位對應到邏輯行;dba_indexes.pct_direct_access可以用來指示對映表GUESS的效率,這個值大於30時推薦重建點陣圖索引;一個索引組織表只有一個對映表。 %( #kJZ
· 通過dba_tables.iot_name, dba_tables.iot_type 可以檢視到索引組織表的溢位表段,對映表段; ] ".SW5b_
· 索引組織表的相關段的段名都是由系統生成的,這些段名的共同特性是SYS_IOT_XXX_YYY, XXX in (TOP 索引段, OVER 溢位表段, MAP 對映表段),YYY是索引組織表的OBJECT_ID。 0E/ 16@ 6=
oC|']r 6
標識未使用過的索引 il kN 3J
· 索引建立後是否使用是由優化器來控制的,某些索引可能不會使用到,這樣的索引不僅加重了DML操作的負擔,也佔用空間;可以用下面的方法找出這樣的索引,然後刪除; s d XZsQ w
Ø 找出某個或某些被懷疑的索引; Kd Lj 1 T
Ø ALTER INDEX index_name MONITORING USAGE; 9bu 1A x1M
Ø 在資料庫經歷一定時間的活動後再執行: ALTER INDEX index_name NOMONITORING USAGE; ] u jXPK=t
Ø 查詢v$object_usage.index_name, v$object_usage.used,可以得知被監控的索引在這段時間內是否被使用到。 S= g E'"LT
Mby V_A`r_
}W5 ~ 89"
第三章 SQL 調整 6.分割槽 f- ~ ]
~ A,(D -
-\V;Gw8mD
· 分割槽表是將大表的資料分成稱為分割槽的許多小的子集,9i提供四種分割槽方法:範圍分割槽,列表分割槽,雜湊分割槽和混合分割槽; "rR$2`v"
· 範圍分割槽是根椐分割槽鍵的不同取值範圍來劃分子集的,關鍵字RANGE, VALUES LESS THAN; dW#?{n- H<
· 列表分割槽是根椐分割槽鍵的一些離散的取值來劃分子集的,關鍵字LIST, VALUES; 9[Xe|5?c
· 雜湊分割槽是應用雜湊演算法將分割槽鍵對應到某個子集中去,關鍵字HASH, PARTITIONS; 'Ad|* ~
· 混合分割槽只能有兩層,第一層是範圍分割槽,第二層可以是列表分割槽或者雜湊分割槽; dyu T-. 2
· 範圍分割槽和列表分割槽中,如果插入記錄的分割槽鍵沒有對應的容納分割槽,會產生ORA-14400; GF gh{ '|
· update操作如果會使記錄從一個分割槽遷移到另一個分割槽,且分割槽表的ROW MOVEMENT屬性是DISABLE,會產ORA-14402; M F s W
· 分割槽表上的索引有兩大類:普通的二叉樹索引,分割槽索引,下面講到的都是分割槽索引: 3Qu Ft~@ @
· 按索引分割槽和表分割槽間的對應關係可以分為區域性索引和全域性索引; UszR. Z
Ø 區域性索引的索引分割槽和表分割槽間是一一對應的,全域性索引則相反; BnIZ+ fg=
Ø 區域性索引的分割槽方法可以用上面提到四種的任何一種,全域性索引的分割槽方法只有範圍分割槽(而且最高的分割槽必須用MAXVALUE來定義); psB9~EU&Q
Ø ORACLE自動維護區域性索引的分割槽,當表分割槽被合併,分裂或刪除時,關聯的索引分割槽也會被合併,分裂或刪除;對分割槽表執行管理操作時會使其上的全域性索引失效; eLyaTOZadu
Ø 建在分割槽表的點陣圖索引必須是區域性分割槽索引; r+;AE N48
Ø ORACLE推薦儘可能地使用區域性索引; F+::UWK A
· 按索引欄位和分割槽鍵間的關係分為字首索引和非字首索引; H & =3rkX
Ø 字首索引最前面的欄位是分割槽鍵欄位,非字首索引相反; KfMaV U=4P
· 在這兩種分類方法的四種組合中,只有三種有效(區域性字首索引,區域性非字首索引,全域性字首索引),不存在全域性非字首索引; j GKasI`
· 分割槽表給CBO帶來很多選項,如分割槽排除,並行分割槽連線等。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/119501/viewspace-609376/,如需轉載,請註明出處,否則將追究法律責任。

相關文章