在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語句來删除表,特别是那種資料量有可能很大的臨時存儲表。
在手動段空間管理(Manual Segment Space Management)中,段中隻有一個HWM,但是在Oracle9iRelease1才添加的自動段空間管理(Automatic Segment Space Management)中,又有了一個低HWM的概念出來。為什麼有了HWM還又有一個低HWM呢, 這個是因為自動段空間管理的特性造成的。在手段段空間管理中,當資料插入以後,如果是插入到新的資料塊中,資料塊就會被自動格式化等待資料通路。而在自動段空間管理中,資料插入到新的資料塊以後,資料塊并沒有被格式化,而是在第一次在第一次通路這個資料塊的時候才格式化這個塊。是以我們又需要一條水位線, 用來标示已經被格式化的塊。這條水位線就叫做低HWM。一般來說,低HWM肯定是低于等于HWM的。