建立表/索引时的 存储参数:【PCTUSED参数与PCTFREE参数】
PCTFREE、PCTUSED、FREELIST的關(guān)系和應(yīng)用?
概念:? pctused:一個塊的使用水位的百分比,這個水位將使該塊返回到可用列表中去等待更多的插入操作。
? pctfree:用來為一個塊保留的空間百分比,以防止在今后的更新操作中增加一列或多列值的長度。
? freelist:可用列表是表中的一組可插入數(shù)據(jù)的可用塊。
? 行連接:指一行存儲在多個塊中的情況,這是因為該行的長度超過了一個塊的可用空間大小,即行鏈接是跨越多塊的行。
? 行遷移:指一個數(shù)據(jù)行不適合放入當前塊而被重新定位到另一個塊(那里有充足的空間)中,但在原始塊中保留一個指針的情形。原始塊中的指針是必需的,因為索引的ROWID項仍然指向原始位置。
? 計算公式:
? PCTFREE=(Average Row Size-Initial Row Size)*100/Average Row Size
? PCTUSED=(100-PCTFREE) -Average Row Size * 100/Availabe Data Space
設(shè)置建議:
使用情形:
??? 1、在ASSM為AUTO的模式下,Oracle根據(jù)dba_tables.avg_row_len來調(diào)整PCTUSED的大小,如下圖所示
?? 2、在ASSM為MANUAL的模式下,oracle根據(jù)設(shè)置的pctused參數(shù)來調(diào)整pctused大小
?? 使用select * from dba_tables 可以查看表的pctused、pctfree參數(shù)的設(shè)置大小、以及avg_row_len的大小。
概念:????
?? 1、PCTFREE:塊中保留用于UPDATE操作的空間百分比,當數(shù)據(jù)占用的空間達到此上限時,新的數(shù)據(jù)將不能再插入到此塊中;????
??? 2、PCTUSED:指定塊中數(shù)據(jù)使用空間的最低百分比;當一個塊在達到PCTFREE,之后經(jīng)歷了一些DELETE操作,在其空間使用下降到PCTUSED后便可以重新被用于INSERT數(shù)據(jù);這就是PCTFREE/PCTUSED參數(shù)的含義;
????? 調(diào)整PCTFREE、PCTUSED參數(shù)的目標一方面是提高性能,另一方面則主要是提高空間使用效率,避免出現(xiàn)塊中存在有許多未用的空間,但卻無法找到一個塊可以被用于插入新數(shù)據(jù)行的情況發(fā)生。
???? PCTFREE的使用
???? 在Oracle中表的每一行數(shù)據(jù)由唯一的ROWID標記;而Oracle支持的數(shù)據(jù)類型中有一些長度是可變的,如VARCHAR,當對這些數(shù)據(jù)進行 UPDATE時,如果塊中的可用空間不能容納UPDATE后的數(shù)據(jù)行時,Oracle將會把此行移到其它數(shù)據(jù)塊,同時保留此數(shù)據(jù)行的ROWID不變,并在 原有塊中建一指針指向行遷移后的位置。在這種情況下讀取一行數(shù)據(jù)將需要訪問2個數(shù)據(jù)塊,從而導致性能下降。PCTFREE保留的空間就是為確保更改后的數(shù) 據(jù)行可以仍存放于原有數(shù)據(jù)塊中,避免行遷移的情況發(fā)生。 由此,如果PCTFREE設(shè)置不足時可能產(chǎn)生行遷移;而另一方面如果PCTFREE設(shè)置過高,將會造成空間浪費。因此正確設(shè)置PCTFREE需要對表中數(shù) 據(jù)的使用進行分析。對于數(shù)據(jù)長度不會變化或極少更新的情況,可以采用較小的PCTFREE;對于其它大多數(shù)情況應(yīng)采用稍大的PCTFREE (PCTFREE的缺省值是10,如果不好估計需預留的空間,可以使用15-25的范圍),不要為節(jié)約塊中的空間而使用較小的PCTFREE值。
????? PCTUSED的使用
?????? 當塊的使用的空間下降到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ù),當塊的使用的空間是在PCTUSED之上,Oracle將把此塊從Freelist中移走;當塊的使用的空間是在PCTUSED之 下,Oracle將會擴展段空間。因此,PCTUSED如果設(shè)得過高,將導致段的不斷擴展。 當數(shù)據(jù)行長度不大時,使用缺省的PCTUSED(40)是比較合適的;對于行長度較大的情況,最長的行有可能會占用半個以上的塊空間,此時可設(shè)置 PCTUSED為10。較小的PCTUSED僅在表中的數(shù)據(jù)以隨機方式被刪除,而且仍有一些行長時間保留在塊中時,才會造成空間使用上的問題,因為這些塊 可能需要較長的時間才能或永遠不能重新被用于存放新數(shù)據(jù)。在這種應(yīng)用中,如果空間利用率一直處于較低水平,則需對PCTUSED進行分析和調(diào)整。
??? pctfree參數(shù)是控制freelist un-links的(即將塊由freelists中移除)。設(shè)置pctfree=10 意味著每個塊都保留10%的空間用作行擴展。pctused參數(shù)是控制freelist re-links的。設(shè)置pctused=40意味著只有在塊的使用低于40%時才會回到表格的freelists中。
----------------
???? 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ù)塊加到空閑列表中。當記錄從數(shù)據(jù)表中刪除時,數(shù)據(jù)庫的數(shù)據(jù)塊就有空間接受新的記錄,但只有 當填充的空間降到PCTUSED值以下時,該數(shù)據(jù)塊才被連接到空閑列表中,才可以往其中插入數(shù)據(jù)。PCTUSED的默認值是PCTUSED=40。 (1)PCTUSED較高意味著相對較滿的數(shù)據(jù)塊會被放置到空閑列表中,從而有效的重復使用數(shù)據(jù)塊的空間,但會導致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操作擴展了一個VARCHAR2類型 的列或BLOB列后,PCTFREE參數(shù)所指定的空間不夠擴展,從而記錄被ORACLE強制遷移到新的數(shù)據(jù)塊,發(fā)生這種情況將較嚴重的影響ORACLE的 性能,出現(xiàn)更新緩慢)。
如何設(shè)定
?????? 在建表或者索引時,指定存儲參數(shù),如
CREATE TABLE HR.WZHU
(
ID???? NUMBER,
NAME?? VARCHAR2(20 BYTE),
VALUE VARCHAR2(20 BYTE)
)
TABLESPACE USERS
PCTUSED??? 0
PCTFREE??? 10
INITRANS?? 1
MAXTRANS?? 255
STORAGE??? (
??????????? INITIAL????????? 64K
??????????? MINEXTENTS?????? 1
??????????? MAXEXTENTS?????? UNLIMITED
??????????? PCTINCREASE????? 0
??????????? BUFFER_POOL????? DEFAULT
?????????? )
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;
CREATE UNIQUE INDEX HR.ID_PRIMARY ON HR.WZHU
(ID)
LOGGING
TABLESPACE USERS
PCTFREE??? 10
INITRANS?? 2
MAXTRANS?? 255
STORAGE??? (
??????????? INITIAL????????? 64K
??????????? MINEXTENTS?????? 1
??????????? MAXEXTENTS?????? UNLIMITED
??????????? PCTINCREASE????? 0
??????????? BUFFER_POOL????? DEFAULT
?????????? )
NOPARALLEL;
總結(jié)
以上是生活随笔為你收集整理的建立表/索引时的 存储参数:【PCTUSED参数与PCTFREE参数】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RAC IP 地址修改
- 下一篇: 学习笔记:ORACLE 性能优化求生指南