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.
相关推荐
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 ...
`INITRANS`和`MAXTRANS`设定了初始和最大事务数。`STORAGE`子句定义了段的存储参数,如初始和后续块大小、最小和最大扩展次数等。`LOGGING`表示该表的修改操作会被记录到redo log中,确保事务的持久性和一致性。 ...
ITL中的SLOT数量由初始化参数initrans和maxtrans决定,它们在创建对象时指定。然而,从Oracle 10g开始,maxtrans参数已被废弃,Oracle会根据块的可用空间动态扩展ITL的SLOT数量。 总之,Oracle的锁机制在保证数据...
### Oracle 创建和删除索引详解 #### 一、Oracle索引概述 在Oracle数据库中,索引是一种重要的数据结构,用于提高数据检索速度。通过创建索引,可以显著提升查询性能,尤其是在处理大型数据表时更为明显。索引类似...
- **INITRANS 和 MAXTRANS**:初始化和最大事务表条目,用于管理块中的锁定信息。 在设计和管理Oracle表时,理解这些概念和参数至关重要。正确设置PCTFREE和PCTUSED可以优化更新和插入操作,避免行迁移带来的性能...
在数据库管理与维护中,掌握一些常用的Oracle SQL语句是非常必要的,它们能够帮助我们高效地解决问题和提高工作效率。下面,我将详细解释文档中提及的几个Oracle SQL语句及其用法。 1. 索引在线更新: Oracle中的...
- **存储参数**:`pctfree`、`initrans`、`maxtrans`、`initial`等,分别控制了数据块中预留的空间比例、初始事务数、最大事务数以及初始分配的存储空间大小。 2. **添加约束** ```sql alter table DHC_BY_...
这些选项如PCTFREE、PCTUSED、INITRANS、MAXTRANS等用于控制表的存储和性能,而TABLESPACE指定了表所在的表空间,AS query则允许使用SQL SELECT语句从现有表中创建新表。 通过这个课程,学习者将掌握如何管理和查询...
### Oracle在线建立超大表的索引 #### 需求背景 在Oracle数据库中,为含有千万级别记录的大表创建索引是一项挑战性任务,尤其...此外,通过合理配置参数和选择恰当的时间点执行操作,能够显著降低对现有业务的影响。
- 设定合理的存储参数,如pctfree、initrans、maxtrans等。 - 考虑并行创建索引,以加速大表的索引构建。 - 使用nologging选项创建索引,以节省重做日志空间和提高效率。 6. **最佳实践**: - 使用`CREATE ...
3. **优化初始存储参数**:在表创建初期设定的存储参数如PCTFREE、PCTUSED、INITRANS、MAXTRANS等,可能随数据增长和使用模式变化而不适用。在线重组结合参数调整,可以优化数据布局,提升更新和查询性能。 4. **...
索引的物理属性包括表空间、pctfree、initrans、maxtrans、storage参数等,这些参数对于索引的性能和空间使用有着直接影响。合理设置这些参数可以避免索引数据块的浪费,同时还能减少对重做日志文件空间的需求。 ...
本文将详细介绍如何使用Java通过JDBC向Oracle数据库中插入图片文件的方法。此过程涉及到的主要技术包括Java编程语言、Oracle数据库以及JDBC驱动。为了实现这一目标,我们将从创建数据库表开始,然后逐步介绍如何使用...
表的存储参数如`pctfree`、`initrans`、`maxtrans`等,是Oracle数据库管理空间和事务控制的重要设置,用于控制表的物理存储和性能优化。例如,`pctfree`设定数据块中未使用的空间比例,`initrans`和`maxtrans`分别...
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; ``` ...
`PCTFREE`、`INITRANS`、`MAXTRANS`和`STORAGE`参数用于控制索引空间的分配和增长策略,以适应不同负载的性能需求。 在比对过程中,使用游标(Cursor info)和嵌套循环来逐条处理比对结果。然而,这种方式可能会...
Oracle 索引是关系数据库中用于存放每一条记录的一种对象,主要目的是加快数据的读取速度和完整性检查。在数据库设计阶段与数据库结构时就要考虑。应用系统的性能直接与索引的建立是否合理直接有关。 一、建立索引 ...
创建索引时,可以选择特定的表空间,并设置适当的存储参数,如pctfree、initrans、maxtrans、minextents和maxextents,以优化空间利用率。 在处理大型表时,可以考虑并行创建索引,这可以显著减少创建时间并提高...
初始化事务槽(INITRANS)指定了在创建表或索引时预先分配的事务槽数量,而最大事务槽(MAXTRANS)则定义了块中可以分配的最大事务槽数量。PCTFREE参数设定了一个阈值,当块中的空间使用率达到这个比例时,Oracle会...
此外,PCTFREE、PCTUSED、INITRANS、MAXTRANS、STORAGE等参数用于控制表的存储特性和性能,例如初始分配的块大小、后续增长的块大小、最小和最大扩展次数等。 在实际的数据库管理与维护中,除了创建表和设置约束外...