ORACLE FREELIST HWM(3)
4.最佳化
4.1手工回收儲存空間
在HIGH WATER MARK以上的塊對效能沒有影響,但是會耗費空間。如何空間大小是一個考慮的問題,就可以決定回收空塊。
假設表T1的儲存示意圖如圖2.5所示,使用ALTER TABLE ... DEALLOCATE UNUSED語句可以回收HWM以上的空間。比如:
alter table t1 deallocate unused;
回收後T1的儲存示意如圖4.1.1
如果在ALTER TABLE ... DEALLOCATE UNUSED語句中使用了KEEP關鍵字,則可以在HWM之後保留指定大小的空閒空間,比如:
alter table t1 deallocate unused keep 10K;
回收後T1的儲存示意如圖4.1.2
4.2刪減表
根據3.2.1可以得到HWM以下塊的使用情況。如何p大於時,對全表掃描效能會產生影響,同時也會耗用空間。
如果能夠確認應用有良好的索引幾乎不會用到全表掃描,那麼HIGH WATER MARK以下的空塊,儘管耗費了空間,不會對訪問產生影響。如果不能確定,那麼就需要考慮刪減表。
刪減表的操作將刪除表中所有的記錄,並且重置HWM標記。表在刪減之後將成為一個空表。
在Oracle中刪減表只有如下的兩種辦法:
1.使用drop語句
先使用drop語句刪除整個表,然後再重建這個表。在刪除-重建的過程中,與表相關的所有索引、完整性約束以及觸發器都會丟失,並且所有依賴於該表的物件都會變為INVALID狀態,同時原來爭對錶的授權也會失效。因此採用這種方式刪除表中的記錄代價太大。
2.使用TRUNCATE語句
TRUNCATE語句屬於DDL語句,不會產生任何回退資訊,並且被立即自動提交。在執行TRUNCATE語句時不會影響到與被刪減表相關的任何資料庫物件與授權,也不會觸發表中所定義的觸發器。此外,在對標進行刪減時,HWM將重置,已經為表分配的儲存空間將被回收。
在執行TRUNCATE語句時,可以透過drop storage子句和reuse storage子句來控制被釋放的區是否回收到表空間中。如何作線上系統的TRUNCATE,不希望表長時間鎖住,那麼可以使用reuse storage子句,僅將HWM重置。
4.3 free list最佳化
free list 競爭出現在多個程式使用同一個free list並試圖同時修改free list頭部資料塊時。可以透過查詢檢視v$waitsate的class型別為data block 的記錄來檢查競爭情況。
產 生data block型別競爭的主要原因是多個程式試圖同時修改free list頭部資料塊。 然而,它也會出現在當程式準備將塊讀入buffer cathe時,另一個程式需要訪問同一個塊。如果能在V$SESSION_WAIT中正好捕獲buffer busy waits,就可以透過查詢V$SESSION_WAIT中的P3來判定是那一類。A 0 或 1014代表讀型別,其他的值為修改競爭的型別。
下 一步需要確定競爭涉及那些段。 如果能夠在V$SESSION_WAIT捕獲waits,就可以用P1和P2的值 (對應file 和 block) 在DBA_EXTENTS中找到段名。 如何是一個表,就很可能需要重建表來建立更多的process freelists。 一種計算需要建立多少個freelist的方法是dump一些段中接近HWM的塊,檢查interested transaction list的個數,具體方法可參見3.1。interested transactions個數的峰值加1 就是需要的最小process freelists的值。
從2.3和2.4可以看出,使用多個free list可能導致更多的空塊未被使用, 也可能導致段更快地擴充套件。如果效能是當前所關心的重點,那麼多free lists 可以用來提高併發訪問能力,當然會增加一些額外空間的耗用。然而,如果空間使用大小是首先考慮的因素,那麼推薦使用single freelist,使引數FREELISTS=1, 當然就不能提升併發事務的效能了。
V$WAITSTAT 也可顯示其他型別class的競爭,包括segment header 和free list。 出現在同一個free list group中多個事務需要同時更新它們的free list header記錄時。 有多種方法來解決這個問題如重建表採用更多的free list groups,或者增加 _bump_highwater_mark_count大小,或者調整應用本身。[@more@]
4.1手工回收儲存空間
在HIGH WATER MARK以上的塊對效能沒有影響,但是會耗費空間。如何空間大小是一個考慮的問題,就可以決定回收空塊。
假設表T1的儲存示意圖如圖2.5所示,使用ALTER TABLE ... DEALLOCATE UNUSED語句可以回收HWM以上的空間。比如:
alter table t1 deallocate unused;
回收後T1的儲存示意如圖4.1.1
如果在ALTER TABLE ... DEALLOCATE UNUSED語句中使用了KEEP關鍵字,則可以在HWM之後保留指定大小的空閒空間,比如:
alter table t1 deallocate unused keep 10K;
回收後T1的儲存示意如圖4.1.2
4.2刪減表
根據3.2.1可以得到HWM以下塊的使用情況。如何p大於時,對全表掃描效能會產生影響,同時也會耗用空間。
如果能夠確認應用有良好的索引幾乎不會用到全表掃描,那麼HIGH WATER MARK以下的空塊,儘管耗費了空間,不會對訪問產生影響。如果不能確定,那麼就需要考慮刪減表。
刪減表的操作將刪除表中所有的記錄,並且重置HWM標記。表在刪減之後將成為一個空表。
在Oracle中刪減表只有如下的兩種辦法:
1.使用drop語句
先使用drop語句刪除整個表,然後再重建這個表。在刪除-重建的過程中,與表相關的所有索引、完整性約束以及觸發器都會丟失,並且所有依賴於該表的物件都會變為INVALID狀態,同時原來爭對錶的授權也會失效。因此採用這種方式刪除表中的記錄代價太大。
2.使用TRUNCATE語句
TRUNCATE語句屬於DDL語句,不會產生任何回退資訊,並且被立即自動提交。在執行TRUNCATE語句時不會影響到與被刪減表相關的任何資料庫物件與授權,也不會觸發表中所定義的觸發器。此外,在對標進行刪減時,HWM將重置,已經為表分配的儲存空間將被回收。
在執行TRUNCATE語句時,可以透過drop storage子句和reuse storage子句來控制被釋放的區是否回收到表空間中。如何作線上系統的TRUNCATE,不希望表長時間鎖住,那麼可以使用reuse storage子句,僅將HWM重置。
4.3 free list最佳化
free list 競爭出現在多個程式使用同一個free list並試圖同時修改free list頭部資料塊時。可以透過查詢檢視v$waitsate的class型別為data block 的記錄來檢查競爭情況。
產 生data block型別競爭的主要原因是多個程式試圖同時修改free list頭部資料塊。 然而,它也會出現在當程式準備將塊讀入buffer cathe時,另一個程式需要訪問同一個塊。如果能在V$SESSION_WAIT中正好捕獲buffer busy waits,就可以透過查詢V$SESSION_WAIT中的P3來判定是那一類。A 0 或 1014代表讀型別,其他的值為修改競爭的型別。
下 一步需要確定競爭涉及那些段。 如果能夠在V$SESSION_WAIT捕獲waits,就可以用P1和P2的值 (對應file 和 block) 在DBA_EXTENTS中找到段名。 如何是一個表,就很可能需要重建表來建立更多的process freelists。 一種計算需要建立多少個freelist的方法是dump一些段中接近HWM的塊,檢查interested transaction list的個數,具體方法可參見3.1。interested transactions個數的峰值加1 就是需要的最小process freelists的值。
從2.3和2.4可以看出,使用多個free list可能導致更多的空塊未被使用, 也可能導致段更快地擴充套件。如果效能是當前所關心的重點,那麼多free lists 可以用來提高併發訪問能力,當然會增加一些額外空間的耗用。然而,如果空間使用大小是首先考慮的因素,那麼推薦使用single freelist,使引數FREELISTS=1, 當然就不能提升併發事務的效能了。
V$WAITSTAT 也可顯示其他型別class的競爭,包括segment header 和free list。 出現在同一個free list group中多個事務需要同時更新它們的free list header記錄時。 有多種方法來解決這個問題如重建表採用更多的free list groups,或者增加 _bump_highwater_mark_count大小,或者調整應用本身。[@more@]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18921899/viewspace-1016950/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE FREELIST HWM(轉)Oracle
- ORACLE FREELIST HWM(2)Oracle
- ORACLE FREELIST HWM(1)Oracle
- Oracle效能調優之FreeList和HWMOracle
- Oracle效能調優 之FreeList和HWMOracle
- Oracle Freelist和HWM的效能優化Oracle優化
- 轉:Oracle Freelist和HWM的效能優化Oracle優化
- Oracle Freelist和HWM原理探討及相關效能最佳化(3)Oracle
- Oracle Freelist和HWM原理及效能最佳化(轉)Oracle
- Oracle Freelist和HWM原理探討及相關效能優化Oracle優化
- Oracle Freelist和HWM原理探討及相關效能優化(轉)Oracle優化
- Oracle Freelist和HWM原理探討及相關效能最佳化Oracle
- Oracle Freelist和HWM原理探討及相關效能最佳化(1)Oracle
- Oracle Freelist和HWM原理探討及相關效能最佳化(2)Oracle
- Oracle HWMOracle
- Oracle 之HWMOracle
- Oracle 高水位(HWM)Oracle
- ORACLE 高水位線(HWM)Oracle
- oracle的高水位線HWMOracle
- oracle的高水位線(HWM)Oracle
- Oracle 高水位(HWM)標記Oracle
- Oracle表段中高水位線HWMOracle
- FREELIST和FREELIST GROUPS簡介
- oracle10g shrink space 降低HWMOracle
- 深入瞭解oracle的高水位(HWM)Oracle
- Oracle高水位線(HWM)及效能優化Oracle優化
- Oracle表段中的高水位線HWMOracle
- 分析HWM
- Oracle案例10——HWM(高水位線)效能優化Oracle優化
- Oracle段高水位(HWM, high water mark)問題Oracle
- 各個Oracle 版本下如何調整高水位(HWM)Oracle
- Oracle中 HWM與資料庫效能的探討Oracle資料庫
- Show_HWM.sqlSQL
- ITL和Freelist的區別
- hwm的一點理解
- zt_eygle_Oracle中 HWM與資料庫效能的探討Oracle資料庫
- oracle11g表的高水位線hwm與dbms_space系列一Oracle
- delete與高水位線HWM回收delete