盤錦威旺做網站建設山西網絡推廣專業(yè)
在Oracle數(shù)據(jù)的存儲中,可以把存儲空間想象為一個水庫,數(shù)據(jù)想象為水庫中的水。水庫中的水的位置有一條線叫做水位線,在Oracle中,這條線被稱為高水位線(High-warter mark, HWM)。在數(shù)據(jù)庫表剛建立的時候,由于沒有任何數(shù)據(jù),所以這個時候水位線是空的,也就是說HWM為最低值。當插入了數(shù)據(jù)以后,高水位線就會上漲,但是這里也有一個特性,就是如果你采用delete語句刪除數(shù)據(jù)的話,數(shù)據(jù)雖然被刪除了,但是高水位線卻沒有降低,還是你剛才刪除數(shù)據(jù)以前那么高的水位。也就是說,這條高水位線在日常的增刪操作中只會上漲,不會下跌。
下面我們來談一下Oracle中Select語句的特性。Select語句會對表中的數(shù)據(jù)進行一次掃描,但是究竟掃描多少數(shù)據(jù)存儲塊呢,這個并不是說數(shù)據(jù)庫中有多少數(shù)據(jù),Oracle就掃描這么大的數(shù)據(jù)塊,而是Oracle會掃描高水位線以下的數(shù)據(jù)塊?,F(xiàn)在來想象一下,如果剛才是一張剛剛建立的空表,你進行了一次Select操作,那么由于高水位線HWM在最低的0位置上,所以沒有數(shù)據(jù)塊需要被掃描,掃描時間會極短。而如果這個時候你首先插入了一千萬條數(shù)據(jù),然后再用delete語句刪除這一千萬條數(shù)據(jù)。由于插入了一千萬條數(shù)據(jù),所以這個時候的高水位線就在一千萬條數(shù)據(jù)這里。后來刪除這一千萬條數(shù)據(jù)的時候,由于delete語句不影響高水位線,所以高水位線依然在一千萬條數(shù)據(jù)這里。這個時候再一次用select語句進行掃描,雖然這個時候表中沒有數(shù)據(jù),但是由于掃描是按照高水位線來的,所以需要把一千萬條數(shù)據(jù)的存儲空間都要掃描一次,也就是說這次掃描所需要的時間和掃描一千萬條數(shù)據(jù)所需要的時間是一樣多的。所以有時候有人總是經常說,怎么我的表中沒有幾條數(shù)據(jù),但是還是這么慢呢,這個時候其實奧秘就是這里的高水位線了。
? ? 那有沒有辦法讓高水位線下降呢,其實有一種比較簡單的方法,那就是采用TRUNCATE語句進行刪除數(shù)據(jù)。采用TRUNCATE語句刪除一個表的數(shù)據(jù)的時候,類似于重新建立了表,不僅把數(shù)據(jù)都刪除了,還把HWM給清空恢復為0。所以如果需要把表清空,在有可能利用TRUNCATE語句來刪除數(shù)據(jù)的時候就利用TRUNCATE語句來刪除表,特別是那種數(shù)據(jù)量有可能很大的臨時存儲表。
修正ORACLE表的高水位線
在ORACLE中,執(zhí)行對表的刪除操作不會降低該表的高水位線。而全表掃描將始終讀取一個段(extent)中所有低于高水位線標記的塊。如果在執(zhí)行刪除操作后不降低高水位線標記,則將導致查詢語句的性能低下。下面的方法都可以降低高水位線標記。
1.執(zhí)行表重建指令 alter table table_name move;
(在線轉移表空間ALTER TABLE … MOVE TABLESPACE …ALTER TABLE … MOVE 后面不跟參數(shù)也行,不跟參數(shù)表還是在原來的表空間,move后記住重建索引如果以后還要繼續(xù)向這個表增加數(shù)據(jù),沒有必要move只是釋放出來的空間,只能這個表用,其他的表或者segment無法使用該空間)
2.執(zhí)行alter table table_name shrink space; 注意,此命令為Oracle 10g新增功能,在執(zhí)行該指令之前必須允許行移動 alter table table_name enable row movement;
3.復制要保留的數(shù)據(jù)到臨時表t,drop原表,然后rename臨時表t為原表
4.emp/imp
5.alter table table_name deallocate unused
6.盡量truncate