oracle性能优化求生指南_oracle性能优化:高水位线(HWM)详解--如何计算HWM
概述
深入理解HWM對于做數據庫優化是必須掌握的一個基礎,很多時候我們以為刪了數據后表應該會快很多,但是得到的結果卻很不理想,這其中就涉及到HWM方面了,也是truncate和delete不同的地方。
一、什么是水線 (High Water Mark)?
所有的 oracle 段(segments,在此,為了理解方便,建議把 segment 作為表的一個同義詞) 都有一個在段內容納數據的上限,我們把這個上限稱為"high water mark"或 HWM。這個 HWM是一個標記,用來說明已經有多少沒有使用的數據塊分配給這個 segment。
HWM 通常增長的幅度為一次5個數據塊,原則上 HWM 只會增大,不會縮小,即使將表中的數據全部刪除,HWM還是為原值。
HWM 很象一個水庫的歷史最高水位,這也就是 HWM 的原始含義,當然不能說一個水庫沒水了,就說該水庫的歷史最高水位為0。但是如果我們在表上使用了 truncate 命令,則該表的 HWM 會被重新置為0。
HWM本身的信息是儲存在段頭.在段空間是手工管理方式時,ORACLE是通過FREELIST(一個單向鏈表)來管理段內的空間分配.在段空間是自動管理方式時(ASSM),ORACLE是通過BITMAP來管理段內的空間分配.
二、HWM 數據庫的操作有如下影響:
1、全表掃描通常要讀出直到 HWM 標記的所有的屬于該表數據庫塊,即使該表中沒有任何數
據。
2、即使 HWM 以下有空閑的數據庫塊,鍵入在插入數據時使用了 append 關鍵字,則在插入時使用 HWM 以上的數據塊,此時 HWM 會自動增大。
三、如何計算一個表的 HWM ?
1、首先對表進行分析:
ANALYZE TABLE ESTIMATE/COMPUTE STATISTICS;
2、計算HWM
SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name = ;
說明:
BLOCKS 列代表該表中曾經使用過得數據庫塊的數目,即水線。
EMPTY_BLOCKS 代表分配給該表,但是在水線以上的數據庫塊,即從來沒有使用的數據塊。
3、實例
1)查看表段
create table test_hwm2 as select * from dba_objects;
SELECT segment_name, segment_type, blocks FROM dba_segments WHERE segment_name='TEST_HWM2';
2) 分析表
ANALYZE TABLE TEST_HWM2 ESTIMATE STATISTICS;
3)計算HWM
SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables WHERE table_name='TEST_HWM2';
總的塊數是1275,沒有使用的塊是3,也就是TEST_HWM2的HWM為1275-3+1=1273
注意:
這里DBA_SEGMENTS.BLOCKS 表示分配給這個表的所有的數據庫塊的數目。USER_TABLES.BLOCKS 表示已經使用過的數據庫塊的數目。
四、Oracle 表段中的高水位線 HWM
在 Oracle 數據的存儲中,可以把存儲空間想象為一個水庫,數據想象為水庫中的水。水庫中的水的位置有一條線叫做水位線,在Oracle中,這條線被稱為高水位線(High-warter mark,HWM)。在數據庫表剛建立的時候,由于沒有任何數據,所以這個時候水位線是空的,也就是說 HWM 為最低值。當插入了數據以后,高水位線就會上漲,但是這里也有一個特性,就是如果你采用 delete 語句刪除數據的話,數據雖然被刪除了,但是高水位線卻沒有降低,還是你剛才刪除數據以前那么高的水位。也就是說,這條高水位線在日常的增刪操作中只會上漲,不會下跌。
下面我們來談一下 Oracle 中 Select 語句的特性。Select 語句會對表中的數據進行一次掃
描,但是究竟掃描多少數據存儲塊呢,這個并不是說數據庫中有多少數據,Oracle 就掃描
這么大的數據塊,而是 Oracle 會掃描高水位線以下的數據塊。
如果是一張剛剛建立的空表,你進行了一次 Select 操作,那么由于高水位線 HWM 在最低的0位置上,所以沒有數據塊需要被掃描,掃描時間會極短。而如果這個時候你首先插入了一千萬條數據,然后再用 delete 語句刪除這一千萬條數據。由于插入了一千萬條數據,所以這個時候的高水位線就在一千萬條數據這里。后來刪除這一千萬條數據的時候,由于 delete 語句不影響高水位線,所以高水位線依然在一千萬條數據這里。這個時候再一次用 select 語句進行掃描,雖然這個時候表中沒有數據,但是由于掃描是按照高水位線來的,所以需要把一千萬條數據的存儲空間都要掃描一次,也就是說這次掃描所需要的時間和掃描一千萬條數據所需要的時間是一樣多的。
之前小編也寫了個存儲過程是專門來計算HWM的,大家也可以通過那個方法來計算,降低HWM可以使用rebuild、truncate、shrink、move等操作,后面會介紹下怎么通過move去降低HWM,感興趣的朋友可以關注下!!
總結
以上是生活随笔為你收集整理的oracle性能优化求生指南_oracle性能优化:高水位线(HWM)详解--如何计算HWM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 客制化键盘键位修改_IQUNIX Sli
- 下一篇: c mysql 工具类_Jave工具—