`

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.oracle.com.cn/viewthread.php?tid=1613

             http://blog.sina.com.cn/s/blog_5eb210c50100gq7m.html

             http://lzfhope.blog.163.com/blog/static/63639922008111945947367/
             http://blog.sina.com.cn/s/blog_7414f6640100uouf.html

本文原创,转载请注明出处、作者

如有错误,欢迎指正

邮箱:czmcj@163.com

0
0
分享到:
评论
5 楼 zzwssfd 2012-05-29  
哈哈  谢了
4 楼 czmmiao 2012-05-29  
zzwssfd 写道
又把文档看了一遍,现在是这样理解的:
一个新的数据块,可以不停的插入数据,直到空间使用率是100-pctfree后不能继续插入(而不是空间使用率超过pctused后,就不能插入)。而这个数据块要想再插入数据,只有当它的空间使用率在pctused之下以后(而不是小于100-pctfree),才能继续插入数据,直到空间使用率再次超过100-pctfree。

you're right
3 楼 zzwssfd 2012-05-29  
又把文档看了一遍,现在是这样理解的:
一个新的数据块,可以不停的插入数据,直到空间使用率是100-pctfree后不能继续插入(而不是空间使用率超过pctused后,就不能插入)。而这个数据块要想再插入数据,只有当它的空间使用率在pctused之下以后(而不是小于100-pctfree),才能继续插入数据,直到空间使用率再次超过100-pctfree。
2 楼 czmmiao 2012-05-29  
zzwssfd 写道
请教:下面的理解是否正确。pctfree=20,pctused=40
1,一个新的数据块,不停的向其中插入数据,当数据块容量被利用超过40%后,不能再向其中      插入数据。那么虽然pctfree=20,实际上有60%的空间是用来更新的。
2,一个刚好空间被利用80%的数据块,是不能向其中插入数据的,但可以更新。直到这个数据块的已使用空间小于40%,才能继续插入数据。且到40%时,不能插入。

1、当一个块的使用空间达到100-pctfree值时,这个块从自由列表脱离。当pctfree为20,数据块使用40%的时候,可用来做insert的空间为100-pctfree-40=40%。pctfree的20%空间主要是为以下场景准备的,数据块已经使用了80%或者接近80%的空间不会再进行insert,此时如果update数据块中的现有内容,则会利用到剩余的20%进行update,你的说法不能说完全错误,感觉表达不是很准确。
2、文档上是说降到pctuesd后才会继续使用该块进行insert,我认为没有必要折腾是否在这临界值上会进行insert,实际意义不大。
1 楼 zzwssfd 2012-05-28  
请教:下面的理解是否正确。pctfree=20,pctused=40
1,一个新的数据块,不停的向其中插入数据,当数据块容量被利用超过40%后,不能再向其中      插入数据。那么虽然pctfree=20,实际上有60%的空间是用来更新的。
2,一个刚好空间被利用80%的数据块,是不能向其中插入数据的,但可以更新。直到这个数据块的已使用空间小于40%,才能继续插入数据。且到40%时,不能插入。

相关推荐

    bbs论坛项目运用SSH框架Oracle数据库编写的一个简单示列项目

    pctfree 10 pctused 40 initrans 1 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); -- Create/Recreate primary, unique and foreign key constraints alter table USERS ...

    oracle emp, dept, salgrade 建表语句

    ) PCTFREE 10 INITRANS 2 MAXTRANS 255 ) TABLESPACE "SYSTEM" PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 12K NEXT 12K MINEXTENTS 1 MAXEXTENTS 249 PCTINCREASE 50 FREELISTS 1 ...

    常用的Oracle SQL 语句

    PCTFREE 5 PCTUSED 90 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 512k NEXT 512k PCTINCREASE 0 MINEXTENTS 1 MAXEXTENTS 999), PARTITION WDZW21 VALUES LESS THAN (200000) PCTFREE 5 PCTUSED 90 INITRANS 1 ...

    sql命令参考 命令解析

    这个子句允许你调整PCTUSED、PCTFREE、INITRANS和MAXTRANS等参数,影响数据块的使用和管理。PCTUSED和PCTFREE分别设置数据块被用到多少百分比时开始记录空闲空间,而INITRANS和MAXTRANS则设定事务初始化和最大事务...

    3.1 Oracle模式对象(1).ppt

    这些选项如PCTFREE、PCTUSED、INITRANS、MAXTRANS等用于控制表的存储和性能,而TABLESPACE指定了表所在的表空间,AS query则允许使用SQL SELECT语句从现有表中创建新表。 通过这个课程,学习者将掌握如何管理和查询...

    Oracle表的类型及定义[归类].pdf

    - **PCTFREE** 和 **PCTUSED**:PCTFREE设置块的预留空闲空间,避免行迁移;PCTUSED则定义何时将块放回freelist。 - **INITIAL, NEXT, PCTINCREASE**:定义段的扩展策略,但在局部管理表空间中,通常设置INITIAL=...

    贝塔斯曼商业案例研究

    参数如PCTFREE、PCTUSED、INITRANS、MAXTRANS、INITIAL、NEXT、MINEXTENTS、MAXEXTENTS和PCTINCREASE等,都直接影响着数据块的更新行为和空间利用率。随着数据的增删,这些参数可能需要调整以适应实际性能需求,此时...

    图解使用ORACLE存储过程创建时间维表.doc

    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; ``` 此表...

    Oracle数据库管理与维护大作业整理.pdf

    此外,PCTFREE、PCTUSED、INITRANS、MAXTRANS、STORAGE等参数用于控制表的存储特性和性能,例如初始分配的块大小、后续增长的块大小、最小和最大扩展次数等。 在实际的数据库管理与维护中,除了创建表和设置约束外...

    oracle分区操作文档

    - `PCTFREE` 和 `PCTUSED` 指定了数据块中可用空间的百分比。 - `INITRANS` 和 `MAXTRANS` 控制了事务数量。 - `PARALLEL (DEGREE 2)` 表示允许并行操作的度数。 - `STORAGE` 子句定义了存储参数,如初始分配...

    DBControlOnline技术白皮书(含贝塔斯曼案例)

    3. **优化存储参数**:初始创建表时,DBA需预估多个存储参数,如PCTFREE、PCTUSED、INITRANS、MAXTRANS、INITIAL、NEXT、MINEXTENTS、MAXEXTENTS及PCTINCREASE等。随着数据的实际使用情况变化,这些参数可能需要调整...

    针对oracle的在线重组与优化

    3. **优化初始存储参数**:在表创建初期设定的存储参数如PCTFREE、PCTUSED、INITRANS、MAXTRANS等,可能随数据增长和使用模式变化而不适用。在线重组结合参数调整,可以优化数据布局,提升更新和查询性能。 4. **...

    oracle教学ppt

    - 表和索引的存储参数:如PCTFREE、PCTUSED、INITRANS、MAXTRANS等,影响数据存储和性能。 5. **备份与恢复**: - 冷备份:关闭数据库时进行的物理备份。 - 热备份:在归档模式下进行的在线备份,不影响数据库...

    Oracle高级队列(AQ)

    storage_clause => 'TABLESPACE QUEUE_TS PCTUSED 0 PCTFREE 30 INITRANS 30 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 BUFFER_POOL DEFAULT )' ); END; ``` ...

    Oracle数据库管理与维护大作业.docx

    此外,表的存储参数也进行了设置,例如`pctfree`、`pctused`、`initrans`、`maxtrans`和`storage`参数,这些参数影响了表空间的使用效率和性能。例如,`pctfree`定义了数据块中保留的空间比例,而`initrans`和`...

    oracle新手入门指导之一——数据库表空间知识.txt

    - **PCTFREE 和 PCTUSED**:这两个参数用于控制空闲空间的管理。 - `PCTFREE`:定义了插入新行时保留的空闲空间比例,有助于减少碎片化。 - `PCTUSED`:定义了删除行后允许的空间利用比例,有助于减少空间浪费。 ...

    oracle里常用命令之三

    `tablespace_name`用于指定表所在的表空间,`pctfree`和`pctused`控制块的预留空间,`initrans`和`maxtrans`设置初始和最大事务数,`storage`关键字后跟存储参数,如`initial`、`next`、`pctincrease`、`maxextents`...

    Oracle常用的和表(Table)相关的命令

    [pctfree integer] [pctused integer] [initrans integer] [maxtrans integer]; storage ( initial 200k next 200k pctincrease 0 maxextents 50 ) [logging|nologging] [cache|nocache]; ``` **解析**: - `...

    存储结构与关联

    - **INITRANS/MAXTRANS**:初始化和最大事务数,控制块上可以有多少个事务。 - **PCTFREE/PCTUSED**:分别用于控制块内预留的空闲空间比例和已使用的空间比例,以优化更新操作和插入操作。 #### Block Space Usage ...

    创建监控表的DML的触发器-0422

    MAXTRANS 255 STORAGE ( INITIAL 64K MINEXTENTS 1 MAXEXTENTS UNLIMITED ); ``` 该表包含以下几个关键字段: - `LT_DATE`: 记录操作发生的时间。 - `SID`: 会话标识符。 - `SERIAL#`: 会话序列号。 - `USERNAME...

Global site tag (gtag.js) - Google Analytics