zoukankan      html  css  js  c++  java
  • Oracle 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以上不用了,属于淘汰行列。

    本篇文章来源于 原文链接:http://www.net527.com/Oracle_shujuku/Oracle_renzheng/5911.html

  • 相关阅读:
    HDU 5115 Dire Wolf (区间DP)
    HDU 4283 You Are the One(区间DP(最优出栈顺序))
    ZOJ 3469 Food Delivery(区间DP好题)
    LightOJ 1422 Halloween Costumes(区间DP)
    POJ 1651 Multiplication Puzzle(区间DP)
    NYOJ 石子合并(一)(区间DP)
    POJ 2955 Brackets(括号匹配一)
    POJ 1141 Brackets Sequence(括号匹配二)
    ZOJ 3537 Cake(凸包+区间DP)
    Graham求凸包模板
  • 原文地址:https://www.cnblogs.com/future2012lg/p/2694801.html
Copyright © 2011-2022 走看看