oracle高水位降低法

2022-08-24 04:36:10 字數 2565 閱讀 7548

1.什麼是高水位?(high water mark 簡稱:hwm)

所有的oracle段(segments,在此,為了理解方便,建議把segment作為表的乙個同義詞)都有乙個在段內存放資料的上線,那麼我們把這個上線成為「high water mark」或                   hwm.hwm是乙個標記,用來說明已經有多少沒有使用的資料塊分配給了這個segment。mwm通常增長的幅度為一次5個資料塊。原則上

mwm只會增大,不會縮小。即使表中的全部資料都刪除了,那麼hwm還是原值,不會變,由於這個特點,使得hwm就像乙個水庫的歷史最高水位。

簡單的說就像水庫裡的歷史最高水位。 就如剛挖的水庫一樣裡面沒有一滴水,那麼它的最高水位為0.同理在剛建的新錶中

由於沒有一條資料,所以的高水位是0,隨著不斷的往裡面新增資料,進行增刪操作,那麼它的高水位就會**。 當然也不是

說你把表的資料刪掉一半,它的高水位就會下降,因為高水位代表歷史最高水位。  在oracle中執行delete刪除操作不會降低高水位。執行truncate

操作可以降低高水位,通常能把高水位降到0.  所以為了降低高水位,能盡量使用truncate的就不使用delete操作。

---------也就是說進行增刪操作只會**,不會**!!!

2.select 特性和高水位的關係

在oracle中執行select 操作掃瞄的是高水位以下的全部資料塊。所以不是說資料庫中存放了多少資料塊,就會掃瞄多少個資料塊。現在回想以下,如果是乙個新建的表,裡面沒有數       據,那麼你執行select 掃瞄操作,那麼高水位線基本就在0上,所以就沒有資料塊被掃瞄。掃瞄的時間就會用的很少。但是現在你往表裡

插入1000萬條資料,然後再執行delete操作,但是由於delete操作不影響高水位線,所以高水位線還是原來的高水位線。

----------所以就有人經常會說我的表中明明沒有一條資料,但是執行select掃瞄怎麼會那麼慢呢,這個時候裡面的奧秘就在於高水位線了!

3.為什麼要降低高水位?

就行水庫洩洪一樣,你會開啟水閘把超出最高水位預警線的水消退掉。 那麼在oracle中高水位以下存放的都是資料塊,每次全表掃瞄的時候

都會把高水位以下的全部資料庫都掃瞄一邊,如此以來就會很浪會資源,響應時間比較長。  反之,如果我們把高水位降低,那麼每次全表掃瞄的時候

是不是掃瞄的資料塊是不是就少了。

4.為什麼出來乙個低hwm?

在管理段的時候通常有兩種方法:手動管理段空間(manual segment space management )和自動段空間(automatic segment space management)。

在手動管理段空間的時候,段中只有乙個hwm,但是為什麼又會有乙個低hwm呢?其實這都是因為自動管理段空間造成的。 在手動管理的時候

資料插入到新的資料塊中,資料庫塊就先會被格式化然後等待資料訪問,但是在自動管理中呢,資料插入到新的資料塊中,資料塊並沒有被格式化,而是在第一次訪問這個資料        庫塊的時候才格式化這個塊。所以我們又需要一條水位線,用來標示已經被格式化的快。這條線就叫做低hwm.

一般來說,低hwm肯定地獄hwm.

5.hwm資料庫的操作有如下影響:

6.那麼如何降低高水位呢?

降低高水位通常有很多辦法。就比如抗洪,你是如何想把洪水消退,可能會想到把水庫的水閘開啟,把水放掉。。。。。。

但是在oracle中降低高水位通常有以下辦法:

1.能使用truncate的盡量不適用delete操作。

2.新建乙個臨時表,把資料複製到臨時表,然後把源表drop掉,再把臨時表重新命名為源表的名字。

3.移動表空間。(或者不移動表空間)

5.執行alter table table_name shrink space; 注意,此命令為oracle 10g新增功能,再執行該指令之前必須允許行移動alter table table_name enable row movement;

檢視高水位時先進行分析:

--

每次查詢各個結果時先分析表 才能得到最新的分析結果

analyze table biu_issuer_info compute

statistics

;select

num_rows, blocks, empty_blocks, owner

from

user_tables

where table_name =

'biu_issuer_info

'; --

注意這裡查詢一定要用大寫

select

count(distinct dbms_rowid.rowid_block_number(rowid) ||

dbms_rowid.rowid_relative_fno(rowid)) zs

from

biu_issuer_info;

--如果實際用的塊數比高水位線低很多的話,則調整高水位可顯著改善全表掃瞄效率

alter

table

biu_issuer_info enable row movement;

alter

table biu_issuer_info shrink space;

SHRINK SEGMENT降低高水位

oracle 10g 語法 alter tableshrink space compact cascade alter tableshrink space compcat 收縮表,但會保持 high water mark 這怎麼理解?相當於沒回縮?相當於把塊中資料打結實了。沒有變動hwm alter...

如何降低Oracle表的高水位?

view plain copy to clipboard print?alter table table name move tablespace tbs name select alter index index name rebuild sql text from user index ui w...

降低oracle高水位線方法總結

1.執行表重建指令 alter table table name move 驗證不可行,不降低水位線,但可釋放表空間 當你建立了乙個物件如表以後,不管你有沒有插入資料,它都會占用一些塊,oracle也會給它分配必要的空間.同樣,用alter table move釋放自由空間後,還是保留了一些空間給這...