Oracle中一些設置參數的意義

術語:

 高水標記:如果將一張表想象成水平結構,一系列的塊都是從左向右排列,成一條直線放置,高水標記(high water mark)就是曾經包含數據的最右邊的塊。隨着數據不斷地放入表中,使用了更多的塊,從而高水標記不斷上升,如果刪除了一些表中的行,有許多塊可能不再包含數據,但是這些塊仍然在高水標記以下,並且保持在高水標記以下直到對象被重建或刪減。在全掃描期間,Oracle將掃描高水標記以下的所有塊,即使它們不包含數據,這將影響全掃描的性能,尤其高水標記以下的大部分塊都是空時。truncate將重新設置表的高水標記,讓它返回0,而delete表中所有行時高水標記不會改表。如果計劃刪除表中的每一行時,使用truncate方法比較合適。

自由列表(FreeList):用來跟蹤高水標記以下有空閒空間的塊對象,每一個對象至少有一個FreeList和它相關,當塊被使用時,Oracle將根據需要放置或取走FreeList,只有一個對象在高水標記以下的塊才能在FreeList上發現,一個對象可能不止有一個FreeList,如果預料會有許多並行用戶對一個對象進行大量對的插入和更新操作,配置多個FreeList能提高整體性能,擁有足夠的FreeList供使用是很關鍵的,能極大提高性能,其代價是增加存儲空間。在創建表的時候可以指定FreeList的個數,或者後來更改其個數。create table table1 (id integer) storage (freelist 20);更改時:alter table table1 storage(freelist 20);需要注意的是:Cannot alter freelist storage parameter for segments in tablespaces with AUTO SEGMENT SPACE MANAGEMENT,否則會拋出ORA-10620: Operation   not   allowed   on   this   segment    
  Cause:   Cannot   alter   freelist   storage   parameter   for   segments   in   tablespaces   with   AUTO   SEGMENT   SPACE   MANAGEMENT  
  Action:   Recheck   the   segment   name   and   re-issue   the   statement   。在把freeList由高值改爲較小的值時,空間將被較小,快有現有的多個FreeList將合併成一個主FreeList。

PCTFREE & PCTUSED    這兩個設置用來控制何時增加和撤銷FreeList。pctused:一個塊的使用水位的百分比,這個水位將使該塊返回到可用列表中去等待更多的插入操作。pctfree:用來爲一個塊保留的空間百分比,以防止在今後的更新操作中增加一列或多列值的長度。
行連接:指一行存儲在多個塊中的情況,這是因爲該行的長度超過了一個塊的可用空間大小,即行鏈接是跨越多塊的行。
行遷移:指一個數據行不適合放入當前塊而被重新定位到另一個塊(那裏有充足的空間)中,但在原始塊中保留一個指針的情形。原始塊中的指針是必需的,因爲索引的ROWID項仍然指向原始位置。
要形容一個 BLOCK 的運作,可以把一個 BLOCK 想成一個水杯。waiter把水倒入放在我們面前的水杯,要多滿呢,可以要求他倒 9 分滿好了,這時 PCTFREE 代表着設定爲10 ,意思就是說,當 BLOCK 使用到達 90% 的時候,就不可以再使用了,這個 BLOCK 應該從 FREELIST 列表中移除 (un-link) 。保留 10% 的空間是爲了提供 update 時所可能增加的空間使用,如果空間保留的太小,就容易發生 row chaining 。 PCTUSED 代表着這杯水什麼時候可以添加,假設 PCTUSED 爲 40 ,代表當我們把水杯的水喝到剩下 40% 以下時,waiter就會知道需要加水了。你想想看,如果說在餐廳裏你每喝一口水waiter就來加水,你會不會覺得很煩,對餐廳來說,也要派很多人不斷幫每桌客人加水,所以說, PCTUSED 代表着 re-link 回 FREELIST 的意義,如果說 PCTUSED 設的太大,例如 70 好了,代表這杯水你隨便喝一口waiter就要來加水了,這隱含的意義是,這個杯子的利用率增加,但是waiter頻繁的服務造成了負荷 (I/O Overhead) 。 PCTUSED 設小一點,例如 10 ,代表當水喝到剩下 10% 的時候 ( 如同 DELETE事務操作 ) ,才需要放回 FREELIST ,代表可以加水了 ( 如同 INSERT 事務操作 ) 。如果希望存儲空間發揮最大使用效益,可以把PCTUSED設大一點,相反的,如果想要提高IO效能,應該把PCTUSED設定小一點。在OCP文檔上那張圖,一目瞭然,當使用一個block時,在達到pctfree之前,該block是一直可以被插入的這個時候處在上升沿,pctused在下降沿起作用。
關於pctfree設置,ocp教材上有建議,可以參考:PCTFREE缺省爲 10,如果沒有 UPDATE 活動,爲0
pctused和pctFree和freelist是很關鍵的,一方面,避免許多行的遷移,另一方面,避免浪費太多空間,1、高PCTFREE,低PCTUSED,用於插入許多將要更新的數據,並且更新經常會增加行的大小,這樣插入後在塊上保留了許多空間(高PCTFREE),在塊返回到自由列表之前,塊必須機會是空的(低PCTUSED);2、低PCTFREE,高PCTUSED,用於傾向於對錶只使用INSERT和DELETE,或者如果要UPDATE,UPDATE也只是會使行變小。

INITIAL,NEXT,PCTINCREASE這些都是存儲參數,設定盤區的大小。定義INITIAL的大小,分配給表的隨後的盤區,以及NEXT盤區應該增加的百分比,數據庫應該使用局部管理並且盤區大小一致的表空間,INITIAL盤區總是等於NEXT盤區的大小,並且不必使用PCTINCREASE,使用這個參數只會導致表空間產生碎片。在沒有使用局部管理表空間的情況下,建議總是設置INITIAL=NEXT 和PCTINCREASE等於0。

MINEXTENTS和MAXEXTENTS控制對象對它自己分配的盤區數,設定min告訴oracle最初分配給表多少盤區,如在局部管理表空間中使用一致的盤區大小爲1M,minExtents設爲10,會使表得到10M的存儲空間。

INITRANS和MAXTRANS。對象中的每一個塊都有一個塊頭,塊頭的一部分是事務表,事務表中的條目描述哪一個事務塊上的行或元素被鎖定了,事務塊的最初大小由INITRANS設置,默認2,當需要時,事務表可以動態增加,大小最多到MAXTRANS(家丁塊上有足夠的空閒空間),每一個分配的事務條目在塊頭上佔用23字節的存儲空間。

發佈了28 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章