在
oracle
資料的儲存中,可以把儲存空間想象為乙個水庫,資料想象為水庫中的水。水庫中的水的位置有一條線叫做水位線,在
oracle
中,這條線被稱為高水位線(
high-warter mark, hwm
)。在資料庫錶剛建立的時候,由於沒有任何資料,所以這個時候水位線是空的,也就是說
hwm為最低值。當插入了資料以後,高水位線就會**,但是這裡也有乙個特性,就是如果你採用
delete
語句刪除資料的話,資料雖然被刪除了,但是高水位線卻沒有降低,還是你剛才刪除資料以前那麼高的水位。也就是說,這條高水位線在日常的增刪操作中只會**,不會**。
下面我們來談一下
oracle
中select
語句的特性。
select
語句會對錶中的資料進行一次掃瞄,但是究竟掃瞄多少資料儲存塊呢,這個並不是說資料庫中有多少資料,
oracle
就掃瞄這麼大的資料塊,而是
oracle
會掃瞄高水位線以下的資料塊。現在來想象一下,如果剛才是一張剛剛建立的空表,你進行了一次
select
操作,那麼由於高水位線
hwm在最低的
0位置上,所以沒有資料塊需要被掃瞄,掃瞄時間會極短。而如果這個時候你首先插入了一千萬條資料,然後再用
delete
語句刪除這一千萬條資料。由於插入了一千萬條資料,所以這個時候的高水位線就在一千萬條資料這裡。後來刪除這一千萬條資料的時候,由於
delete
語句不影響高水位線,所以高水位線依然在一千萬條資料這裡。這個時候再一次用
select
語句進行掃瞄,雖然這個時候表中沒有資料,但是由於掃瞄是按照高水位線來的,所以需要把一千萬條資料的儲存空間都要掃瞄一次,也就是說這次掃瞄所需要的時間和掃瞄一千萬條資料所需要的時間是一樣多的。所以有時候有人總是經常說,怎麼我的表中沒有幾條資料,但是還是這麼慢呢,這個時候其實奧秘就是這裡的高水位線了。
那有沒有辦法讓高水位線下降呢,其實有一種比較簡單的方法,那就是採用
truncate
語句進行刪除資料。採用
truncate
語句刪除乙個表的資料的時候,類似於重新建立了表,不僅把資料都刪除了,還把
hwm給清空恢復為
0。所以如果需要把錶清空,在有可能利用
truncate
語句來刪除資料的時候就利用
truncate
語句來刪除表,特別是那種資料量有可能很大的臨時儲存表。
修正oracle
表的高水位線
在oracle
中,執行對錶的刪除操作不會降低該錶的高水位線。而全表掃瞄將始終讀取乙個段
(extent)
中所有低於高水位線標記的塊。如果在執行刪除操作後不降低高水位線標記,則將導致查詢語句的效能低下。下面的方法都可以降低高水位線標記。
Oracle表段中的高水位線HWM
在oracle資料的儲存中,可以把儲存空間想象為乙個水庫,資料想象為水庫中的水。水庫中的水的位置有一條線 叫做水位線,在oracle中,這條線被稱為高水位線 high warter mark,hwm 在資料庫錶剛建立的時候,由於沒有任何資料,所以這個時候水位線是空的,也就是說hwm為最低值。當插入了...
Oracle表段中的高水位線HWM
在oracle資料的儲存中,可以把儲存空間想象為乙個水庫,資料想象為水庫中的水。水庫中的水的位置有一條線叫做水位線,在oracle中,這條線被稱為高水位線 high warter mark,hwm 在資料庫錶剛建立的時候,由於沒有任何資料,所以這個時候水位線是空的,也就是說hwm為最低值。當插入了資...
Oracle表段中的高水位線HWM收藏
在oracle資料的儲存中,可以把儲存空間想象為乙個水庫,資料想象為水庫中的水。水庫中的水的位置有一條線叫做水位線,在oracle中,這條線被稱為高水位線 high warter mark,hwm 在資料庫錶剛建立的時候,由於沒有任何資料,所以這個時候水位線是空的,也就是說hwm為最低值。當插入了資...