Oracle 段区块 分配 (2)
生活随笔
收集整理的這篇文章主要介紹了
Oracle 段区块 分配 (2)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
接上文 Oracle 段區塊 分配 (1)
六, oracle 的行遷移和行鏈接. (Row Chaining and Migrating)
??? 上面提過了, oracle是允許把多個數據行放到同1個塊中的。
???? 而且, oracle會盡量把同1個數據行的所有數據放到同1個塊中, 這樣避免讀取1個數據行要訪問2個或以上的塊.
???? 而oracle是怎么避免這個問題呢。1個關鍵就是pctfree 和 pctused 的設置
?????6.1 pctfree
???? 這個參數在新建1個table/cluster的時候可以被指定。? 默認是10%
????? 假如 pctfree 的值是10%, 那么當1個block的剩余空間一但只剩下10%時, 這個block就不允許insert 新的數據行入來了。
????? 那么這個10% 空間是否就沒用呢, 不是, 它用于預留給這個block 當前存在的數據行數據行因為update操作而造成的數據增長。
???????? 也就是說當1個block的剩余空間減少到pctfree的值時。 就不允許被insert 新的數據行了。但是里面的數據允許被update或delelte.
???????? 這樣做的好處是避免因為update動作, 導致blocks的里面空間不夠用. 當因為這種情況出現時, 那么其中一條或多條數據行的數據就在這個block里裝不下了。
???????? 6.2 行遷移
??????? 因為上面的出現的情況
???????? oracle就會把這個整個行移動另1個塊(很可能不是物理連接的下1個塊),而在原來那個block那個行原來位置寫上1個指針。指向被轉移到的那個新block的地址(編號)。 這個就是行遷移( Row chainnig)
???????? 這個情況下, 為了讀取這個數據行。 就必須讀取兩個塊。 性能下降了。
???????? 所以行遷移的出現通常是因為pctfree過少。 被一次update動作擠暴..
???????? 行遷移多了,就會導致數據表性能下降。
???????? 6.3 行鏈接
???? 上文說過了, Oracle會盡最大努力把同1個數據所有行放如到1個塊中/
????? 但是當1個數據行數據實在太大(大于塊的容量), 這時就必需用2個或以上的block來存放這個數據行。
????? 行鏈接同樣會導致訪問1個數據行而訪問多個blocks
????? 而行鏈接通常是因為blocksize大小不足導致的。 所以如果一張表的列很多很長, 建議把它放到blocksize 比較大的表空間中。
????
? ? ? ?? 6.4 查看行遷移和行鏈接.
?SELECT table_name,NUM_ROWS, --表中的記錄數
BLOCKS, --表中數據所占的數據塊數 //高水位線
EMPTY_BLOCKS, --表中的空塊數
AVG_SPACE, --數據塊中平均的使用空間
CHAIN_CNT, --表中行連接和行遷移的數量
AVG_ROW_LEN --每條記錄的平均長度
FROM DBA_TABLES where table_name='EMP'
利用如上語句去查看 行遷移的或行鏈接的數量。
如果chain_cnt的值很大。 ? 那么就要查看avg_row_len 平均長度。 如果行平均長度很小,遠小于blocksize, 那么這個問題就很可能是行遷移導致的, 這時我們就要調整pctfree的大小。
如果avg_row_len的值很接近blocksize, 則可以判斷肯定是發生了行鏈接了。 建議把表轉移到blocksize較大的表空間。 ??????
??????? 6.5 pctused
????? 那么是否block的剩余空間一旦觸發pctfree,就永遠不能被Insert新數據行呢。
?????? 這時pctused 的作用就出來了, 假如pctused設置為40%
?????? 當這個block里面的數據被delete 或update造成了數據減少, 當數據減少到40%時, 這時pctfree的限制被接觸。又能被insert新的數據了,直至重新觸發pctfree.
?????? 但是在段的管理模式是自動管理模式(強烈推薦的模式)下,設置這個參數是沒意義的.所以oracle會自動管理,所以大部分情況請忽略掉這個參數吧.
總結
以上是生活随笔為你收集整理的Oracle 段区块 分配 (2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle 段区块 分配 (1)
- 下一篇: 博客会被搬去csdn