oracle優化:避免全表掃描
http://www.cnblogs.com/oraclelike/p/6146436.html
如果我們查詢了一條SQL語句,這條SQL語句進行了全表掃描,那到底是掃描了多少個數據塊呢?是表有多少數據,就掃描多少塊嗎?不是的。而是掃描高水位線一下的所有塊。有的時候有人經常說,我的表也不大呀,怎么查詢了這么久,其實奧秘就是高水位線了。
在數據庫表剛建立的時候,由於沒有任何數據,所以這個時候水位線是空的,也就是說HWM為最低值。當插入了數據以后,高水位線就會上漲,但是這里也有一個特性,就是如果你采用delete語句刪除數據的話,數據雖然被刪除了,但是高水位線卻沒有降低,還是你剛才刪除數據以前那么高的水位。也就是說,這條高水位線在日常的增刪操作中只會上漲,不會下跌。HWM通常增長的幅度為一次5個數據塊.
這也就產生一種我們經常遇到的情況,產生大量碎片。如何消除碎片呢?有move和shrink兩種方法。1.如果你只是收縮空間,數據增長很慢,那用shrink可以但是如果數據增長很快的話,用move就比較合適。2.move從segment的底部開始,move這些rows到segment的頭部。Shrink則是delete/insert相結合,這樣會產生非常多的UNDO和REDO。(move和shrink之后,索引會失效,需要重建索引)推薦使用move。