关于 PCTFREE and PCTUSED详解

转载 2013年12月06日 12:06:14
为了便于理解,先看看这些概念的意思

在字典管理时使用:

为了便于理解,我们可以把整个块看成是2室1厅,其中1室占10%(pctfree)其中2室占40%(pctused),厅占50%,我们的仓库的门上贴上(空,满)两个状态,一开始状态为空,那么当我们第2室的空间一直在放东西,但该房间全部填满(40%的空间),然后厅也装满了(50%的空间),这时再装的话,门上贴上满的状态,这时只有减少某个货物的空间(UPDATE),或者拿走某个货物(DELETE),一直把厅里的所有货物都被清理后,门的状态就边成空的状态,这时,就可以从外面再装货物了。

这样设置的好处就是,假设你有很多仓库空着,但是你某个仓库,频繁的装入,卸载货物,始终没有把2室一厅添满,这样,所有的人都堆在该仓库中,那该仓库管理员是不是要累死,所以就要通过PCTFREE,PCTFREE,FREELIST来均衡到不同的仓库中。

设置pctused,pctfree的用处
为了避免行迁移和行链接,要均衡进出freelist(设置状态满/空)的频率,太频繁不好,状态一次也不变也不好

ORACLE通常通过牺牲空间来避免行迁移和行链接,也就是pctfree,所以我们考虑性能时,看既要尽量减少行迁移的发生,就是由于更新使原来行增成(比如VARCHAR2),我们可以理解为2号室加客厅都已经将近放满了,而这次更新使得空间将容不下整个2室一厅,也就是说更新变大的空间甚至搭上1号室还不够,就会产生行迁移的情况,所以更新变大的情况经常发生时,建议把1号室变大(也就是要用大PCTFREE)

那么如果pctused设置很大的情况下,这样就很容易有机会状态为空(进freelist),所以对(insert)有好处,因为他插入成功的几率很高,但是由于频繁插入,使得空间很快把厅(1-pctfree-pctfree)也装忙,当要update时,很容易行迁移,所以pctused适合频繁要插入的数据,当然有些删除也不错,这样也有更多的机会再次低于pctused,使得进入freelist.但我觉得太频繁的一下insert一大批数据达到pctfree,状态为满,然后马上又删除大量的行,使得状态置为空也不好,频繁操作freelist,比如insertinto tab 7K数据,紧接着delete tab7k,这样频繁的操作就不合适了pctused很高了.


那么高pctfree的作用正好相反,他比较合适频繁更新的操作,因为,如果更新变大,也不容易行迁移,而且会大大利用pctfree的空间不至于浪费.如果更新变小,还可以便于INSERT操作.
那么如果有频繁删除(取货)或更新变小,使得很容易把状态至为空(进freelist) pctfree和pctused的使用

较高的pctfree的值大约在20到25之间,较低的值为4或5,可用于静态表或只读表。除非要严格地管理可用空间,否则不要设置pctused超过40或50。一般这两个值地和不能达到90,否则会使Oarcle将更多地时间花费在处理空间利用上。下面是几个参考:pctfree 5,pctused 40 适合于静态表或只读表。pctfree 10,pctused 50适合插入行后,更新活动不会增加已有行地长度地综合性OLTP系统。pctfree 20,pctused 40适合于插入行后,更新活动会增加已有行地长度地OLTP系统。 


1)PCTFREE、PCTUSED使你能控制一个segment里所有数据块里free space的使用。
    PCTFREE:一个数据块保留的用于块里已有记录的可能更新的自由空间占block size的最小比例。
    PCTUSED:在新记录被插入block里之前这个block可以用于存储行数据和其他信息的空间所占的最小比率。

    2)这两个参数的使用
   如果创建表的时候指定pctfree=20%,oracle会在这个表的data segment的每个block都保留20%的空间用于已有记录的更新。Block的已使用空间上升到整个block size的80%时,这个block将移出free list;在提交了delete、update之后,oracle server处理这条语句并检查对应block的已使用空间是否低于PCTUSED,如果是,则这个block放进free list。

    3)PCTFREE、PCTUSED的设定
    • PCTFREE
    – Default 10
    – Zero if no UPDATE activity
    – PCTFREE = 100 × upd / (average row length)
    • PCTUSED
    – Default 40
    – Set if rows deleted
    – PCTUSED = 100 – PCTFREE – 100 × rows × (average row length) / blocksize
   其中,upd:the average amount added by updates, in bytes。This is determined by subtracting the average row length of intercurrent average row length;
    average row length:在运行了analyize命令之后,这个值可以从dba_tables中的avg_row_len列中获得。
    rows:the number of rows to be deleted before free list maintenance occurs。

    4)Delete、update可以增加block的自由空间,但是释放出来的空间有可能是不连续的,oracle在下列情况下会对碎片进行整理:一个block有足够的自由空间容纳row piece,但是由于每个碎片都较小以至这个row piece不能存放在一个连续的section中。

    6、Migration和Chaining

    1)如果一行的数据太大以至一个单独的block容纳不下,会产生两种现象:
    A、Chaining:行数据太大以至一个空block容纳不下,oracle会将这一行的数据存放在一个或多个block组成的block chain中,insert、update都可能导致这个问题,在某些情况下row chaining是不能避免的。
    B、Migration:一次update操作可能导致行数据增大,以至它所在的block容纳不下,oracle server会去寻找一个有足够自由空间容纳整行数据的block,如果这样的block存在,oracle server把整行移到新的block,在原位置保存一个指向新存放位置的镜像行,镜像行的rowid和原来的rowid一致。
    Chaining、Migration的弊端:insert、update的性能降低,索引查询增加了IO次数。

    2)检测migration和chaining:
    Analyize table table_name compute statistics;[Page]
    Select num_rows,chain_cnt from dba_tables where table_name=’...’;
   查询镜像行:
    Analyze table table_name list chained rows;
    Select owner_name,table_name,head_rowid from chained_rows where table_name=’...’;
   产生Migration的原因可能是由于PCTFREE设置的太低以至没有保留足够的空间用于更新。
   可以通过增加PCTFREE的值避免行镜像产生。





关于PCTFREE
(2006-08-04 17:49:13)
转载
    分类: java&oracle
为了便于理解,先看看这些概念的意思

在字典管理时使用:

为了便于理解,我们可以把整个块看成是2室1厅,其中1室占10%(pctfree)其中2室占40%(pctused),厅占50%,我们的仓库的门上贴上(空,满)两个状态,一开始状态为空,那么当我们第2室的空间一直在放东西,但该房间全部填满(40%的空间),然后厅也装满了(50%的空间),这时再装的话,门上贴上满的状态,这时只有减少某个货物的空间(UPDATE),或者拿走某个货物(DELETE),一直把厅里的所有货物都被清理后,门的状态就边成空的状态,这时,就可以从外面再装货物了。

这样设置的好处就是,假设你有很多仓库空着,但是你某个仓库,频繁的装入,卸载货物,始终没有把2室一厅添满,这样,所有的人都堆在该仓库中,那该仓库管理员是不是要累死,所以就要通过PCTFREE,PCTFREE,FREELIST来均衡到不同的仓库中。

设置pctused,pctfree的用处
为了避免行迁移和行链接,要均衡进出freelist(设置状态满/空)的频率,太频繁不好,状态一次也不变也不好

ORACLE通常通过牺牲空间来避免行迁移和行链接,也就是pctfree,所以我们考虑性能时,看既要尽量减少行迁移的发生,就是由于更新使原来行增成(比如VARCHAR2),我们可以理解为2号室加客厅都已经将近放满了,而这次更新使得空间将容不下整个2室一厅,也就是说更新变大的空间甚至搭上1号室还不够,就会产生行迁移的情况,所以更新变大的情况经常发生时,建议把1号室变大(也就是要用大PCTFREE)

那么如果pctused设置很大的情况下,这样就很容易有机会状态为空(进freelist),所以对(insert)有好处,因为他插入成功的几率很高,但是由于频繁插入,使得空间很快把厅(1-pctfree-pctfree)也装忙,当要update时,很容易行迁移,所以pctused适合频繁要插入的数据,当然有些删除也不错,这样也有更多的机会再次低于pctused,使得进入freelist.但我觉得太频繁的一下insert 一大批数据达到pctfree,状态为满,然后马上又删除大量的行,使得状态置为空也不好,频繁操作freelist,比如insert into tab 7K数据,紧接着delete tab 7k,这样频繁的操作就不合适了pctused很高了.


那么高pctfree的作用正好相反,他比较合适频繁更新的操作,因为,如果更新变大,也不容易行迁移,而且会大大利用pctfree的空间不至于浪费.如果更新变小,还可以便于INSERT操作.
那么如果有频繁删除(取货)或更新变小,使得很容易把状态至为空(进freelist)
 
pctfree和pctused的使用

    较高的pctfree的值大约在20到25之间,较低的值为4或5,可用于静态表或只读表。
    除非要严格地管理可用空间,否则不要设置pctused超过40或50。
    一般这两个值地和不能达到90,否则会使Oarcle将更多地时间花费在处理空间利用上。下面是几个参考:
    pctfree 5,pctused 40 适合于静态表或只读表。
    pctfree 10,pctused 50 适合插入行后,更新活动不会增加已有行地长度地综合性OLTP系统。
    pctfree 20,pctused 40 适合于插入行后,更新活动会增加已有行地长度地OLTP系统。

相关文章推荐

oracle pctfree和pctused详解

一、建立表时候,注意PCTFREE参数的作用       PCTFREE:为一个块保留的空间百分比,表示数据块在什么情况下可以被insert,默认是10,表示当数据块的可用空间低于10%后,就不...

[转]oracle学习笔记一:pctfree、pctused and freelist

转自  http://www.dbasky.com/sinablog/1234/这两天在看一些Oracle概念性的东西,今天看到了block,就把关于它的两个重要概念pctfree和pctued以及f...
  • pj81102
  • pj81102
  • 2011年07月05日 13:20
  • 539

PCTFREE, PCTUSED, and Row Chaining【每日一译】--2012-10-20

For manually managed tablespaces, two space management parameters, PCTFREE and PCTUSED, enable you ...

详解pctused与pctfree

概念:     pctused:一个块的使用水位的百分比,这个水位将使该块返回到可用列表中去等待更多的插入操作。    pctfree:用来为一个块保留的空间百分比,以防止在今后的更新操作中增加一列或...

Oracle pctfree和pctused详解

一、建立表时候,注意PCTFREE参数的作用PCTFREE:为一个块保留的空间百分比,表示数据块在什么情况下可以被insert,默认是10,表示当数据块的可用空间低于10%后,就不可以被insert了...
  • wuye
  • wuye
  • 2016年09月26日 02:33
  • 151

创建表时参数PCTFREE和PCTUSED

pctfree:用于指定BLOCK中必需保留的最小空间的比例。 pctused:为一个百分比数值,当BLOCK中已经使用的空间降低到该数值以下时,该BLOCK才是可用的,达到或是超过这个数值的BLO...

设计一个例子,演示PCTUSED和PCTFREE对数据操作的影响

PCTUSED和PCTFREE是数据块的存储属性,单位都是% PCTFREE:表示什么时候不可以再往块中插入数据,但是更新数据和删除数据是可以的。例如 我们设置为20%,当数据块空闲空间剩余20%时...

创建表时参数PCTFREE和PCTUSED是什么意思?

pctfree:用于指定BLOCK中必需保留的最小空间的比例。pctused:为一个百分比数值,当BLOCK中已经使用的空间降低到该数值以下时,该BLOCK才是可用的,达到或是超过这个数值的BLOCK...
  • iefus
  • iefus
  • 2011年02月22日 10:44
  • 179

段空间管理中的PCTFREE、PCTUSED和FREELISTS

在早期的手动空间管理阶段,Oracle通过一种列表结构FREE LIST来记录数据块的使用情况。需要为每个段设置几个参数。 PCTFREE定义数据块中空闲空间百分比 PCTUSED定义数据块被...

演示PCTUSED和PCTFREE对数据操作的影响

PCTFREE实验,随着pctfree越来越大,block装的记录越少,占用的数据块越多。 SQL> create table test as select rownum as id from dua...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于 PCTFREE and PCTUSED详解
举报原因:
原因补充:

(最多只允许输入30个字)