pctfree
當一個塊的使用空間達到100-pctfree值時,這個塊從自由列表脫離。比如pctfree為10,那么當這個塊使用90%的時候將會脫離freeelist,后續的insert將不會用到這個block。
如果一張表中的數據插入后經常需要進行DML,那么我們須要把PCTFREE參數設置的大一些,以避免行遷移和行鏈接的現象出現。如果一張表插入數據后不 做修改和刪除,那么我們是不是可以把PCTFREE設置的小一些,比如5,甚至更小,這樣的話這張表的每一個數據塊中可以包含更多的記錄,從而減少訪問這 張表帶來的開銷。而如果有一張表,數據塊的熱塊沖突非常嚴重,我們也是否可以通過加大PCTFREE來減少每個數據塊中的記錄數,從而緩解熱塊沖突。實際 上,減少熱塊沖突的更好的辦法是將這張表放在BLOCK_SIZE較小的表空間里,不過在實際生產環境中我們往往難以這么幸運,當發現熱塊沖突存在的時 候,我們只能通過權宜之計來解決問題了。
在調整PCTFREE的時候,我們要注意的是,這個參數是可以動態調整的,但是我們調整PCTFREE參數只能對新的數據插入起作用,對於已經填充過滿的 老數據塊,是無法起作用的,要想徹底解決行遷移的問題,必須調整參數后,對表進行重組,才能對表中的所有數據塊都起作用。對表重組的辦法有很多,比如 ALTER TABLE ... MOVE 或者EXP/IMP。
由於默認的pctfeee是10,所以,如果設置為新值0,或者1,那么可以節省將近10%的空間,而且讀盤的速度也會更快一些。例如pctfeee=0,那么原來放在100個extent上的數據,現在只要在90個extent上就可以了。
例如,創建一個很簡單的表:
create table test_space
(
Name varchar2(24) not null
)
tablespace CRMII
pctfree 0
initrans 2
storage
( initial 64K
next 1K
minextents 1
maxextents unlimited
);
-- Add comments to the columns
comment on column test_space.Name is '姓名';
由於oracle建議我們使用extent management local segment space managment auto ,所以,我們建立表的時候,注意pctfree即可。所以對於永久表格而言,pctused基本上可以進入歷史舞台了,因為臨時表並沒有storage參 數部分。
如果希望在對象創建后更改pctfree參數,可通過下列命令
SQL> alter table t1 pctfree 20;
Table altered.
可通過dba_tables,dba_indexes查看pct_free的參數值,示例如下
SQL> select table_name,pct_free from user_tables where table_name='T1'
TABLE_NAME PCT_FREE
--------------- ----------
T1 20
INITRANS
每個塊都有一個塊首部。這個塊首部中有一個事務表。事務表中會建立一些條目來描述哪些事務將塊上的哪些行/元素鎖定。這個事務表的初始大小由對象的 INITRANS 設置指定。對於表,這個值默認為1,索引的INITRANS 默認為2。事務表會根據需要動態擴展,最大達到MAXTRANS 個條目(假設塊上有足夠的自由空間)。所分配的每個事務條目需要占用塊首部中的23~24 字節的存儲空間。注意,對於Oracle 10g,MAXTRANS 則會忽略,所有段的MAXTRANS 都是255。
也就是說,如果某個事物鎖定了這個塊的數據,則會在這個地方記錄事務的標識,當然那個事務要先看一下這個地方是不是已經有人占用了,如果有,則去看看那個事務是否為活動狀態。如果不活動,比如已經提交或者回滾,則可以覆蓋這個地方。如果活動,則需要等待(閂的作用)
所以,如果有大量的並發訪問使用的這個塊,則參數不能太小,否則資源競爭將導致系統並發性能下降。
測試了一下ORACLE 並發事務的時候的塊分配和ITL 管理,
略去大部分的測試過程,大概的結果小結如下:
1. INITRANS =1 時 並發多個INSERT 事務(本次測試最多5個)的時候並不會由於ITL的爭用而等待組塞,ORACLE 采取的策略是每個INSERT事物分配不同的一些塊來使用,這樣各個會話之間就不會產生沖突,除非段沒有多余的塊(次種情況與本次的主題無關).
2.INITRANS =1 時並發多個UPDATE事務(本次測試最多7個)的時候也不會由於ITL的爭用而導致等待產生,此時ORACLE除了使用默認的ITL之外,另外動態擴展 所需要的ITL,緊緊在非常極端的情況下才會出現等待,(當然應用層面的死鎖或等待與本主題無關)。
1) 該BLOCK沒有FREE空間了,注意FREE參數的設置不能太小。
2) 該塊使用的ITL總數,超過該塊允許的ITL的最大值min(round(block_size*0.5/24) - 2 ,255) 。要達到這樣的極端情況實際的生產情況是很難的,應該比業務SQL的死鎖出現的概率更小。
小結:創建表的時候除非已經清楚,大部分的情況下沒有必要調整INITRANS參數,通常1-4以下足夠用了,INITRANS 設置非常大的時候ORACLE 有出現壞塊的BUG,另外FREE 參數倒是要注意不能隨意改小,除非你已經很清楚更改的后果.
作為一個基本的常識,了解initrans還是很有必要的。IniTrans,用於每個塊中處理行級鎖事務的初始表是1,索引是2,如果同一塊有很多行被 並發更新等操作時,建議增加該值對於serializable隔離級,至少設置為3。但是事實上,不適宜去修改默認的值,因為事務需要在塊上面寫事務條目 信息,這意味着,initrans越大,需要消耗的空間越大,時間也越長。
pctused
當一個block經歷delete操作使已使用空間降到pctused值后,此塊重新被加入freelist,后續的insert將會用到這個block。
maxtrans
在老版本上是為了控制最大並發事務,但是新版本已經自動這么處理了,如果需要的話也可以設置,這個參數和pctused一樣,基本上是可淘汰的!
總結:
pctfree 很重要,但對於查詢系統基本上可以設置為0
pctused 由於10g以后oracle都采用位圖對段和數據塊進行管理了,這個參數基本可以淘汰
initrans ,很重要,但如果不是特別設置,不要去修改。
maxtrans ,至少10g以上不用了,屬於淘汰行列。
本篇文章來源於 原文鏈接:http://www.net527.com/Oracle_shujuku/Oracle_renzheng/5911.html