今天查1張表的時候,查詢表中某1特定類型的數據特別慢,但是查詢全表特別快,也沒找到緣由,百度了1下下,可能感覺(很小的概率)是下面這個
有人說:
說明此表增刪改太頻繁了.將不需要刪除的數據copy到1張臨時表,truncate此表,再把數據copy回來.刪除臨時表。
Oracle表段中的高水位線HWM
在Oracle數據的存儲中,可以把存儲空間想象為1個水庫,數據想象為水庫中的水。水庫中的水的位置有1條線叫做水位線,在Oracle中,這條線被稱為高水位線(High-warter mark, HWM)。在數據庫表剛建立的時候,由于沒有任何數據,所以這個時候水位線是空的,也就是說HWM為最低值。當插入了數據以后,高水位線就會上漲,但是這里也有1個特性,就是如果你采取delete語句刪除數據的話,數據雖然被刪除,但是高水位線卻沒有下降,還是你剛才刪除數據之前那末高的水位。也就是說,這條高水位線在平常的增刪操作中只會上漲,不會下跌。
下面我們來談1下Oracle中Select語句的特性。Select語句會對表中的數據進行1次掃描,但是究竟掃描多少數據存儲塊呢,這個其實不是說數據庫中有多少數據,Oracle就掃描這么大的數據塊,而是Oracle會掃描高水位線以下的數據塊。現在來想象1下,如果剛才是1張剛剛建立的空表,你進行了1次Select操作,那末由于高水位線HWM在最低的0位置上,所以沒有數據塊需要被掃描,掃描時間會極短。而如果這個時候你首先插入了1千萬條數據,然后再用delete語句刪除這1千萬條數據。由于插入了1千萬條數據,所以這個時候的高水位線就在1千萬條數據這里。后來刪除這1千萬條數據的時候,由于delete語句不影響高水位線,所以高水位線仍然在1千萬條數據這里。這個時候再1次用select語句進行掃描,雖然這個時候表中沒有數據,但是由于掃描是依照高水位線來的,所以需要把1千萬條數據的存儲空間都要掃描1次,也就是說這次掃描所需要的時間和掃描1千萬條數據所需要的時間是1樣多的。所以有時候有人總是常常說,怎樣我的表中沒有幾條數據,但是還是這么慢呢,這個時候其實奧秘就是這里的高水位線了。
那有無辦法讓高水位線降落呢,其實有1種比較簡單的方法,那就是采取TRUNCATE語句進行刪除數據。采取TRUNCATE語句刪除1個表的數據的時候,類似于重新建立了表,不但把數據都刪除,還把HWM給清空恢復為0。所以如果需要把表清空,在有可能利用TRUNCATE語句來刪除數據的時候就利用TRUNCATE語句來刪除表,特別是那種數據量有可能很大的臨時存儲表。
在手動段空間管理(Manual Segment Space Management)中,段中只有1個HWM,但是在Oracle9iRelease1才添加的自動段空間管理(Automatic Segment Space Management)中,又有了1個低HWM的概念出來。為何有了HWM還又有1個低HWM呢,這個是由于自動段空間管理的特性釀成的。在手段段空間管理中,當數據插入以后,如果是插入到新的數據塊中,數據塊就會被自動格式化等待數據訪問。而在自動段空間管理中,數據插入到新的數據塊以后,數據塊并沒有被格式化,而是在第1次在第1次訪問這個數據塊的時候才格式化這個塊。所以我們又需要1條水位線,用來標示已被格式化的塊。這條水位線就叫做低HWM。1般來講,低HWM肯定是低于等于HWM的。
最后刪除過后,重新導入數據,又好了。
oracle高水位線詳解
上一篇 離線Web應用Manifest
下一篇 為什么nginx性能如此出色?