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,采用位圖管理段的存儲空間,使用位圖來管理段中已用數(shù)據(jù)塊和空閑數(shù)據(jù)塊.
手工管理方式MANUAL, 采用FREELIST管理段的存儲空間,使用FREELIST來管理段中間的空閑數(shù)據(jù)塊.
數(shù)據(jù)塊的管理方法分為:
1、自動管理方式如創(chuàng)建表空間時設(shè)置為本地管理方式,并且將段的存儲空間方式設(shè)置為AUTO,該表空間的所有塊均采用自動管理方式。系統(tǒng)默認值,
2、手工管理方式是傳統(tǒng)的管理方式,主要通過PCTFREE和PCTUSED兩個存儲參數(shù)控制可用存儲區(qū)的大小,避免行遷移現(xiàn)象的發(fā)生。這兩個參數(shù)可在創(chuàng)建表空間時設(shè)置,
也可在數(shù)據(jù)庫的模式對象(表,索引)中設(shè)置。模式對象中設(shè)置的優(yōu)先級比表空間的要高。如表和索引中沒有設(shè)置,則按表空間的設(shè)置,如表空間也沒設(shè)置,
則按自動管理方式管理塊。
每個表空間中,可以為創(chuàng)建的對象指定缺省的存儲參數(shù)。創(chuàng)建對象時指定的存儲參數(shù)將覆蓋缺省值。如果在創(chuàng)建對象時沒有指定存儲參數(shù),那么系統(tǒng)將使用缺省值。
系統(tǒng)表空間使用ASSM,ASSM使用位圖而不是傳統(tǒng)的FreeList來管理段內(nèi)的free db block,大大提升了空間管理的性能,
同時顯著的減少segment header類型的buffer busy wait等待事件,減少熱快和碎片發(fā)生。
3.? ? ? ? PCTFREE和PCTUSED的概念:
PCTFREE存儲參數(shù)告訴ORACLE什么時候應(yīng)該將數(shù)據(jù)塊從對象的空閑列表中移出。ORACLE的默認參數(shù)是 PCTFREE=10;
也就是說,一旦一個INSERT操作使得數(shù)據(jù)塊的90%被使用,這個數(shù)據(jù)塊就從空閑列表(free list)中移出。
PCTUSED存儲參數(shù)告訴ORACLE什么時候?qū)⒁郧皾M的數(shù)據(jù)塊加到空閑列表中。當(dāng)記錄從數(shù)據(jù)表中刪除時,數(shù)據(jù)庫的數(shù)據(jù)塊就有空間接受新的記錄,
但只有當(dāng)填充的空間降到PCTUSED值以下時,該數(shù)據(jù)塊才被連接到空閑列表中,才可以往其中插入數(shù)據(jù)。PCTUSED的默認值是PCTUSED=40。
(1)PCTUSED較高意味著相對較滿的數(shù)據(jù)塊會被放置到空閑列表中,從而有效的重復(fù)使用數(shù)據(jù)塊的空間,但會導(dǎo)致I/O消耗。
PCTUSED低意味著在一個數(shù)據(jù)塊快空的時候才被放置到空閑列表中,數(shù)據(jù)塊一次能接受很多的記錄,因此可以減少I/O消耗,提高性能。
(2)PCTFREE的值較大意味著數(shù)據(jù)塊沒有被利用多少就從空閑列表中斷開連接,不利于數(shù)據(jù)塊的充分使用。
PCTFREE過小的結(jié)果是,在更新時可能會出現(xiàn)數(shù)據(jù)記錄遷移(Migration)的情況。
(注:數(shù)據(jù)記錄遷移(Migration)是指記錄在是UPDATE操作擴展了一個列后,
PCTFREE參數(shù)所指定的空間不夠擴展,從而記錄被ORACLE強制遷移到新的數(shù)據(jù)塊,發(fā)生這種情況將較嚴重的影響ORACLE的性能,出現(xiàn)更新緩慢)。
PCTFREE的使用
在Oracle中表的每一行數(shù)據(jù)由唯一的ROWID標記;而Oracle支持的數(shù)據(jù)類型中有一些長度是可變的,如VARCHAR,當(dāng)對這些數(shù)據(jù)進行UPDATE時,
如果塊中的可用空間不能容納UPDATE后的數(shù)據(jù)行時,Oracle將會把此行移到其它數(shù)據(jù)塊,同時保留此數(shù)據(jù)行的 ROWID不變,
并在原有塊中建一指針指向行遷移后的位置。
在這種情況下讀取一行數(shù)據(jù)將需要訪問2個數(shù)據(jù)塊,從而導(dǎo)致性能下降。PCTFREE保留的空間 就是為確保更改后的數(shù)據(jù)行可以仍存放于原有數(shù)據(jù)塊中,
避免行遷移的情況發(fā)生。
PCTUSED的使用
當(dāng)塊的使用的空間下降到PCTUSED后,此塊被重新放回空閑鏈表(Freelist) 中,作為后續(xù)Insert的候選塊。同樣,
設(shè)置PCTUSED需要視數(shù)據(jù)行的特性和Insert、Update、Delete的模式而定,但必須遵守的原 則是:db_block_size * (100 - PCTFREE - PCTUSED)必須比行的長度大。
對于數(shù)據(jù)行長度變化較大的情況,應(yīng)使用最大行長度來計算PCTUSED,并且應(yīng)使用較低的PCTUSED值。
因為在執(zhí)行Insert時,如果數(shù)據(jù)塊的可用空間不能裝下一行數(shù)據(jù),當(dāng)塊的使用的空間是在PCTUSED之上,Oracle將把此塊從Freelist中移走;
當(dāng)塊的使用的空間是在PCTUSED之下,Oracle將會擴展段空間。因此,PCTUSED如果設(shè)得過高,將導(dǎo)致段的不斷擴展。 當(dāng)數(shù)據(jù)行長度不大時,
使用缺省的PCTUSED(40)是比較合適的;對于行長度較大的情況,最長的行有可能會占用半個以上的塊空間,此時可設(shè)置 PCTUSED為10。
較小的PCTUSED僅在表中的數(shù)據(jù)以隨機方式被刪除,而且仍有一些行長時間保留在塊中時,才會造成空間使用上的問題,
因為這些塊 可能需要較長的時間才能或永遠不能重新被用于存放新數(shù)據(jù)。在這種應(yīng)用中,如果空間利用率一直處于較低水平,
則需對PCTUSED進行分析和調(diào)整。
4.? ? ? ???建議:
由此,在建表時,如果PCTFREE設(shè)置不足時可能產(chǎn)生行遷移;而另一方面如果PCTFREE設(shè)置過高,將會造成空間浪費。
因此正確設(shè)置PCTFREE需要對表中數(shù)據(jù)的使用進行分析。對于數(shù)據(jù)長度不會變化或極少更新的情況,可以采用較小的PCTFREE;
對于其它大多數(shù)情況應(yīng)采用稍大的 PCTFREE(PCTFREE的缺省值是10,如果不好估計需預(yù)留的空間,可以使用15-25的范圍),
不要為節(jié)約塊中的空間而使用較小的 PCTFREE值。
總結(jié)
以上是生活随笔為你收集整理的Oracle PCTfree assm,Oracle 段空间管理方式与PCTFREE和PCTUSED的概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: oracle查看被锁的行,查找被锁的表到
 - 下一篇: oracle 数据语句优化,oracle