High Water Mark,HWM) 是Oracle(Segment)級別的概念。在僅有DML(比如delete,insert)操作時,高水位線只會增長,不會降低。具體來說,由於程序使用的delete語句不回收使用過的空間,數據雖然刪除了,但是高水位線卻沒有降低,仍然處於之前的水位。
下圖為一個Segment內高水位不斷增長的示意圖:
注:一個表在初次插入記錄時,Oracle會為其分配Segment和block。
插入大量數據後,高水位線隨之增長
當數據被刪除(Delete)後,高水位線並未下降
數據block 圖1. 段(Segment) 內數據塊(block)使用示意圖
1. 降低Oracle數據庫中某些段(Segment)的高水位線,減少使用空間,從而避免不必要的表空間文件膨脹。在此稍作解釋:
如上一節所述,隨著高水位線的增長,表空間文件中的used space部分會逐漸增大,當所有的free space均被使用後,表空間文件的大小會在操作系統級別增大,直到達到最大可擴展大小。如下圖所示:
2. 提高表的掃描效率:由於Oracle的select語句會掃描高水位線以下的所有block,已分配而無數據的block過多時,必然會影響語句的執行效率。而降低高水位能提高這一效率。
在查詢過參考資料、咨詢過相關專家、並且在測試系統充分測試後,在期權生產系統中對當前表空間的一些表進行了高水位回收。擇一例並附步驟解釋如下:
操作對象選擇當前數據表空間TX_DATA_TBS中的BK_OPT_CUST_HOLD_DETAIL表。
此操作在關閉應用程序後執行,並在執行後重新開啟程序。
步驟主要分為三個:
1. 操作前狀態檢查,供操作後比對;
2. 高水位回收操作;
3. 操作後狀態檢查,與操作前狀態比對。
以下為詳細步驟,關鍵查詢結果用不同顏色標注。
1.操作前狀態檢查
-- 查看各表空間的空余空間(free space),此時TX_DATA_TBS表空間空余部分(free space)為721MB。
-- 查看表空間文件狀態,可見TX_DATA_TBS表空間文件當前大小為9900 MB。
-- 查看待回收的表狀態。 -- 查詢表BK_OPT_CUST_HOLD_DETAIL記錄數。
-- 查詢BK_OPT_CUST_HOLD_DETAIL表上的索引狀態。
-- 分析BK_OPT_CUST_HOLD_DETAIL表的狀態。
-- 查詢BK_OPT_CUST_HOLD_DETAIL表的高水位狀態。可知回收前該表所在段共占用122234個block。
-- 查詢該表所在段占用磁盤大小。目前該表所在段共占用955MB。
2.高水位回收操作 -- 由於shrink space操作需要使用“行移動”功能,需要在操作前開啟該功能。
-- 收縮表,回收高水位。
-- 關閉“行移動”功能。
3.操作前狀態檢查 -- 查詢表記錄數、索引情況。與操作前比對,未發生改變。
-- 再次分析BK_OPT_CUST_HOLD_DETAIL表的狀態。
-- 再次查詢BK_OPT_CUST_HOLD_DETAIL表的高水位狀態。可知回收後該表所在段共占用599 個block,回收122234-599 = 121635個block。
-- 再次查詢該表所在段占用磁盤大小。回收後該表所在段共占用4.875 MB,回收950MB。
-- 再次查詢表空間使用情況。與回收前對比,表空間空余空間上漲1671-721 = 950 MB,與表回收空間相同。
-- 但是表空間文件大小仍為9900 MB。可見shrink space操作僅作用於數據段Segment,而對表空間文件級別的大小並無影響。如要改變表空間文件大小,需要另外使用表空間級別的resize操作。 用下圖可簡單解釋回收前後表空間內部空間的變化。
1.回收高水位操作shrink space可對高水位之下未儲存數據的block加以回收,並降低高水位線。既能減少空間使用,又能提高查詢效率,而對表內的數據、表上的索引沒有影響。
2.回收高水位操作shrink space是表和段級別的操作,能釋放表空間文件內的空間,但不能縮小表空間文件的大小。
3.回收操作是DDL操作而非DML操作,不由應用程序完成,需要管理員定期執行。
版權聲明:本文為博主原創文章,未經博主允許不得轉載。