Oracle PCTfree assm,Oracle 段空间管理方式与PCTFREE和PCTUSED的概念
Oracle 段空間管理方式與PCTFREE和PCTUSED的概念
SQL> create table test11 (ID number(10),score number(10,1),name varchar2(20),pc number(10)) tablespace test;
SQL> set timing on
SQL> set time on
SQL> DECLARE i integer;
begin
i:=1;
while i<=1000000 loop
insert into test11(id) values (i);
i:=i+1;
end loop;
commit;
end;
SQL> set timing on
SQL> set time on
SQL> set autotrace traceonly;
SQL> alter session set events '10046 trace name context forever ,level 12';
SQL> alter session set events '10053 trace name context forever ,level 1';
SQL> explain plan for update test11 set score=99 ;
SQL> select * from table (dbms_xplan.display);
SQL> update test11 set score=99;
1000000 rows updated.
Elapsed: 01:00:47.75??-? ?update 時長一個小時
Execution Plan
----------------------------------------------------------
Plan hash value: 1672778901
-----------------------------------------------------------------------------
| Id??| Operation? ?? ?? ? | Name? ?| Rows??| Bytes | Cost (%CPU)| Time? ???|
-----------------------------------------------------------------------------
|? ?0 | UPDATE STATEMENT? ?|? ?? ???|??1000K|??3909K|? ?705? ?(3)| 00:00:09 |
|? ?1 |??UPDATE? ?? ?? ?? ?| TEST11 |? ?? ? |? ?? ? |? ?? ?? ?? ?|? ?? ?? ? |
|? ?2 |? ?TABLE ACCESS FULL| TEST11 |??1000K|??3909K|? ?705? ?(3)| 00:00:09 |
-----------------------------------------------------------------------------
Statistics
----------------------------------------------------------
714??recursive calls
494090309??db block gets
1318480??consistent gets
3329??physical reads
467634216??redo size
824??bytes sent via SQL*Net to client
719??bytes received via SQL*Net from client
3??SQL*Net roundtrips to/from client
9??sorts (memory)
0??sorts (disk)
1000000??rows processed
測試2:
create table test11 (ID number(10),score number(10,1),name varchar2(20),pc number(10)) tablespace users pctfree 50;
conn user/password
@?/rdbms/admin/utlchain.sql
analyze table test11 list chained rows into chained_rows;
select count(*) from chained_rows where table_name='TEST11';
To avoid it, create table test11 with a high value set for pctfree,Repeat the test once again and you will see the update operation completing faster。
2.? ? ? ? 段空間管理方式
段管理主要有兩種方式:
自動管理方式AUTO,采用位圖管理段的存儲空間,使用位圖來管理段中已用數據塊和空閑數據塊.
手工管理方式MANUAL, 采用FREELIST管理段的存儲空間,使用FREELIST來管理段中間的空閑數據塊.
數據塊的管理方法分為:
1、自動管理方式如創建表空間時設置為本地管理方式,并且將段的存儲空間方式設置為AUTO,該表空間的所有塊均采用自動管理方式。系統默認值,
2、手工管理方式是傳統的管理方式,主要通過PCTFREE和PCTUSED兩個存儲參數控制可用存儲區的大小,避免行遷移現象的發生。這兩個參數可在創建表空間時設置,
也可在數據庫的模式對象(表,索引)中設置。模式對象中設置的優先級比表空間的要高。如表和索引中沒有設置,則按表空間的設置,如表空間也沒設置,
則按自動管理方式管理塊。
每個表空間中,可以為創建的對象指定缺省的存儲參數。創建對象時指定的存儲參數將覆蓋缺省值。如果在創建對象時沒有指定存儲參數,那么系統將使用缺省值。
系統表空間使用ASSM,ASSM使用位圖而不是傳統的FreeList來管理段內的free db block,大大提升了空間管理的性能,
同時顯著的減少segment header類型的buffer busy wait等待事件,減少熱快和碎片發生。
3.? ? ? ? PCTFREE和PCTUSED的概念:
PCTFREE存儲參數告訴ORACLE什么時候應該將數據塊從對象的空閑列表中移出。ORACLE的默認參數是 PCTFREE=10;
也就是說,一旦一個INSERT操作使得數據塊的90%被使用,這個數據塊就從空閑列表(free list)中移出。
PCTUSED存儲參數告訴ORACLE什么時候將以前滿的數據塊加到空閑列表中。當記錄從數據表中刪除時,數據庫的數據塊就有空間接受新的記錄,
但只有當填充的空間降到PCTUSED值以下時,該數據塊才被連接到空閑列表中,才可以往其中插入數據。PCTUSED的默認值是PCTUSED=40。
(1)PCTUSED較高意味著相對較滿的數據塊會被放置到空閑列表中,從而有效的重復使用數據塊的空間,但會導致I/O消耗。
PCTUSED低意味著在一個數據塊快空的時候才被放置到空閑列表中,數據塊一次能接受很多的記錄,因此可以減少I/O消耗,提高性能。
(2)PCTFREE的值較大意味著數據塊沒有被利用多少就從空閑列表中斷開連接,不利于數據塊的充分使用。
PCTFREE過小的結果是,在更新時可能會出現數據記錄遷移(Migration)的情況。
(注:數據記錄遷移(Migration)是指記錄在是UPDATE操作擴展了一個列后,
PCTFREE參數所指定的空間不夠擴展,從而記錄被ORACLE強制遷移到新的數據塊,發生這種情況將較嚴重的影響ORACLE的性能,出現更新緩慢)。
PCTFREE的使用
在Oracle中表的每一行數據由唯一的ROWID標記;而Oracle支持的數據類型中有一些長度是可變的,如VARCHAR,當對這些數據進行UPDATE時,
如果塊中的可用空間不能容納UPDATE后的數據行時,Oracle將會把此行移到其它數據塊,同時保留此數據行的 ROWID不變,
并在原有塊中建一指針指向行遷移后的位置。
在這種情況下讀取一行數據將需要訪問2個數據塊,從而導致性能下降。PCTFREE保留的空間 就是為確保更改后的數據行可以仍存放于原有數據塊中,
避免行遷移的情況發生。
PCTUSED的使用
當塊的使用的空間下降到PCTUSED后,此塊被重新放回空閑鏈表(Freelist) 中,作為后續Insert的候選塊。同樣,
設置PCTUSED需要視數據行的特性和Insert、Update、Delete的模式而定,但必須遵守的原 則是:db_block_size * (100 - PCTFREE - PCTUSED)必須比行的長度大。
對于數據行長度變化較大的情況,應使用最大行長度來計算PCTUSED,并且應使用較低的PCTUSED值。
因為在執行Insert時,如果數據塊的可用空間不能裝下一行數據,當塊的使用的空間是在PCTUSED之上,Oracle將把此塊從Freelist中移走;
當塊的使用的空間是在PCTUSED之下,Oracle將會擴展段空間。因此,PCTUSED如果設得過高,將導致段的不斷擴展。 當數據行長度不大時,
使用缺省的PCTUSED(40)是比較合適的;對于行長度較大的情況,最長的行有可能會占用半個以上的塊空間,此時可設置 PCTUSED為10。
較小的PCTUSED僅在表中的數據以隨機方式被刪除,而且仍有一些行長時間保留在塊中時,才會造成空間使用上的問題,
因為這些塊 可能需要較長的時間才能或永遠不能重新被用于存放新數據。在這種應用中,如果空間利用率一直處于較低水平,
則需對PCTUSED進行分析和調整。
4.? ? ? ???建議:
由此,在建表時,如果PCTFREE設置不足時可能產生行遷移;而另一方面如果PCTFREE設置過高,將會造成空間浪費。
因此正確設置PCTFREE需要對表中數據的使用進行分析。對于數據長度不會變化或極少更新的情況,可以采用較小的PCTFREE;
對于其它大多數情況應采用稍大的 PCTFREE(PCTFREE的缺省值是10,如果不好估計需預留的空間,可以使用15-25的范圍),
不要為節約塊中的空間而使用較小的 PCTFREE值。
總結
以上是生活随笔為你收集整理的Oracle PCTfree assm,Oracle 段空间管理方式与PCTFREE和PCTUSED的概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle查看被锁的行,查找被锁的表到
- 下一篇: oracle 数据语句优化,oracle