oracle的資料表空間建立

來源:互聯網
上載者:User

標籤:blog   使用   ar   strong   資料   sp   div   問題   c   

pctfree,pctused,initrans,maxtrans 

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以上不用了,屬於淘汰行列。

oracle的資料表空間建立

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.