`

Oracle中INITRANS和MAXTRANS参数

 
阅读更多

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

 

每个块都有一个块首部。这个块首部中有一个事务表。事务表中会建立一些条目来描述哪些事务将块上的哪些行/元素锁定。这个事务表的初始大小由对象的INITRANS 设置指定。对于表,这个值默认为2(索引的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 参数倒是要注意不能随意改小,除非你已经很清楚更改的后果.

 

 

参考部分INSERT 测试代码 :

( 分3个SESSION insert的 ,x字段1开头的是SESSION 1 插入的,其他2个也类似   )

SQL*Plus: Release 10.1.0.4.0 - Production on Wed Apr 16 10:40:17 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.1.0.4.0 - 64bit Production

With the Partitioning, Real Application Clusters and Data Mining options

 

SQL> create table xx (x number) storage(initial 64k next 64k) initrans 2

Table created.

SQL> truncate table xx;

Table truncated.

SQL> select dbms_rowid.rowid_relative_fno(rowid) file#, dbms_rowid.rowid_block_number(rowid) block# from xx;

no rows selected

SQL> INSERT INTO XX SELECT 11 FROM DUAL;

1 row created.

SQL>                                   

SQL> set linesize 200

SQL> column SEGMENT_NAME format a16

select SEGMENT_NAME,EXTENT_ID,BLOCKS,BYTES from user_extents where segment_name ='XX';SQL>

SEGMENT_NAME      EXTENT_ID     BLOCKS      BYTES

---------------- ---------- ---------- ----------

XX                        0        128    1048576

SQL> select x ,dbms_rowid.rowid_relative_fno(rowid) file#, dbms_rowid.rowid_block_number(rowid) block# from xx;

         X      FILE#     BLOCK#

---------- ---------- ----------

        11         51       4590

SQL> INSERT INTO XX SELECT 12 FROM DUAL;

1 row created.

SQL> select x ,dbms_rowid.rowid_relative_fno(rowid) file#, dbms_rowid.rowid_block_number(rowid) block# from xx;

         X      FILE#     BLOCK#

---------- ---------- ----------

        12         51       4534

        11         51       4590

SQL>

SQL> INSERT INTO XX SELECT 13 from dual;

1 row created.

SQL> select x ,dbms_rowid.rowid_relative_fno(rowid) file#, dbms_rowid.rowid_block_number(rowid) block# from xx;

         X      FILE#     BLOCK#

---------- ---------- ----------

        12         51       4534

        11         51       4590

        13         51       4658

SQL> INSERT INTO XX SELECT 14 from dual;

1 row created.

SQL> select x ,dbms_rowid.rowid_relative_fno(rowid) file#, dbms_rowid.rowid_block_number(rowid) block# from xx;

         X      FILE#     BLOCK#

---------- ---------- ----------

        12         51       4534

        11         51       4590

        13         51       4658

        14         51       4658

SQL> select x ,dbms_rowid.rowid_relative_fno(rowid) file#, dbms_rowid.rowid_block_number(rowid) block# from xx;

         X      FILE#     BLOCK#

---------- ---------- ----------

        12         51       4534

        11         51       4590

        13         51       4658

        14         51       4658

SQL> commit;

Commit complete.

SQL> INSERT INTO XX SELECT 15 from dual;

1 row created.

SQL> insert into xx select 16 from dual;

1 row created.

SQL> commit;

Commit complete.

SQL> select x ,dbms_rowid.rowid_relative_fno(rowid) file#, dbms_rowid.rowid_block_number(rowid) block# from xx order by x;

         X      FILE#     BLOCK#

---------- ---------- ----------

        11         51       4590

        12         51       4534

        13         51       4658

        14         51       4658

        15         51       4658

        16         51       4658

       

        21         51       4537

        22         51       4537

        23         51       4537

        24         51       4537

        25         51       4537

        26         51       4537

       

       

        31         51       4680

        32         51       4614

        33         51       4614

        34         51       4614

        35         51       4614

        36         51       4614

18 rows selected.

分享到:
评论

相关推荐

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

    maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); -- Create/Recreate primary, unique and foreign key constraints alter table USERS add constraint PK_USERID primary key ...

    oracle emp, dept, salgrade 建表语句

    `INITRANS`和`MAXTRANS`设定了初始和最大事务数。`STORAGE`子句定义了段的存储参数,如初始和后续块大小、最小和最大扩展次数等。`LOGGING`表示该表的修改操作会被记录到redo log中,确保事务的持久性和一致性。 ...

    对于Oracle锁的一些理论总结

    ITL中的SLOT数量由初始化参数initrans和maxtrans决定,它们在创建对象时指定。然而,从Oracle 10g开始,maxtrans参数已被废弃,Oracle会根据块的可用空间动态扩展ITL的SLOT数量。 总之,Oracle的锁机制在保证数据...

    oracle 创建和删除索引

    ### Oracle 创建和删除索引详解 #### 一、Oracle索引概述 在Oracle数据库中,索引是一种重要的数据结构,用于提高数据检索速度。通过创建索引,可以显著提升查询性能,尤其是在处理大型数据表时更为明显。索引类似...

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

    - **INITRANS 和 MAXTRANS**:初始化和最大事务表条目,用于管理块中的锁定信息。 在设计和管理Oracle表时,理解这些概念和参数至关重要。正确设置PCTFREE和PCTUSED可以优化更新和插入操作,避免行迁移带来的性能...

    常用的Oracle SQL 语句

    在数据库管理与维护中,掌握一些常用的Oracle SQL语句是非常必要的,它们能够帮助我们高效地解决问题和提高工作效率。下面,我将详细解释文档中提及的几个Oracle SQL语句及其用法。 1. 索引在线更新: Oracle中的...

    Oracle经典建表语句

    - **存储参数**:`pctfree`、`initrans`、`maxtrans`、`initial`等,分别控制了数据块中预留的空间比例、初始事务数、最大事务数以及初始分配的存储空间大小。 2. **添加约束** ```sql alter table DHC_BY_...

    3.1 Oracle模式对象(1).ppt

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

    Oracle在线建立超大表的索引

    ### Oracle在线建立超大表的索引 #### 需求背景 在Oracle数据库中,为含有千万级别记录的大表创建索引是一项挑战性任务,尤其...此外,通过合理配置参数和选择恰当的时间点执行操作,能够显著降低对现有业务的影响。

    oracle开发

    - 设定合理的存储参数,如pctfree、initrans、maxtrans等。 - 考虑并行创建索引,以加速大表的索引构建。 - 使用nologging选项创建索引,以节省重做日志空间和提高效率。 6. **最佳实践**: - 使用`CREATE ...

    针对oracle的在线重组与优化

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

    ORACLE索引介绍与高性能SQL优化

    索引的物理属性包括表空间、pctfree、initrans、maxtrans、storage参数等,这些参数对于索引的性能和空间使用有着直接影响。合理设置这些参数可以避免索引数据块的浪费,同时还能减少对重做日志文件空间的需求。 ...

    利用Java向Oracle中插入图片(BLOB)文件.doc

    本文将详细介绍如何使用Java通过JDBC向Oracle数据库中插入图片文件的方法。此过程涉及到的主要技术包括Java编程语言、Oracle数据库以及JDBC驱动。为了实现这一目标,我们将从创建数据库表开始,然后逐步介绍如何使用...

    oracle省市区单表数据SQL

    表的存储参数如`pctfree`、`initrans`、`maxtrans`等,是Oracle数据库管理空间和事务控制的重要设置,用于控制表的物理存储和性能优化。例如,`pctfree`设定数据块中未使用的空间比例,`initrans`和`maxtrans`分别...

    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索引技术的应用与剖析

    `PCTFREE`、`INITRANS`、`MAXTRANS`和`STORAGE`参数用于控制索引空间的分配和增长策略,以适应不同负载的性能需求。 在比对过程中,使用游标(Cursor info)和嵌套循环来逐条处理比对结果。然而,这种方式可能会...

    oracle索引的建立、修改、删除.doc

    Oracle 索引是关系数据库中用于存放每一条记录的一种对象,主要目的是加快数据的读取速度和完整性检查。在数据库设计阶段与数据库结构时就要考虑。应用系统的性能直接与索引的建立是否合理直接有关。 一、建立索引 ...

    ORACLE索引与高性能SQL介绍

    创建索引时,可以选择特定的表空间,并设置适当的存储参数,如pctfree、initrans、maxtrans、minextents和maxextents,以优化空间利用率。 在处理大型表时,可以考虑并行创建索引,这可以显著减少创建时间并提高...

    ORACLE 10G 学习资源

    初始化事务槽(INITRANS)指定了在创建表或索引时预先分配的事务槽数量,而最大事务槽(MAXTRANS)则定义了块中可以分配的最大事务槽数量。PCTFREE参数设定了一个阈值,当块中的空间使用率达到这个比例时,Oracle会...

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

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

Global site tag (gtag.js) - Google Analytics