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以上不用了,属于淘汰行列。

时间: 2024-08-01 10:01:43

oracle的表空间建立的相关文章

Oracle之表空间、索引、管理权限及角色

Oracle表空间 表空间是数据库的逻辑组成部分,从物理上讲,数据库数据存放在数据文件中 从逻辑上讲,数据库则是存放在表空间中,表空间由一个或多个数据文件组成 数据库的逻辑结构 oracle中逻辑结构包括表空间.段.区和块 说明一下数据库由表空间构成,而表空间又是由段构成,而段又是由区构成,而 区又是由oracle块构成的这样的一种结构,可以提高数据的效率 表空间用于从逻辑上组织数据库的数据.数据库逻辑上是由一个或是多个表空间组成的 通过表空间可以达到以下作用: 1.控制数据库占用的磁盘空间 2

oracle之表空间(tablespace)、方案(schema)、段(segment)、区(extent)、块(block)

数据文件和日志文件是数据库中最重要的文件.它们是数据存储的地方.每个数据库至少有一个与之相关的数据文件,通常情况下不只一个,有很多.数据在数据文件中是如何组织的?要了解这些内容我们首先必须理解什么是表空间(tablespace).段(segment).区(extent).块(block),这些都是oracle数据库在数据文件中组织数据的基本单元.现在我们来理解这些概念. 块是数据存储的物理单位,也是数据文件中最基础的单位,数据直接存储在块上.是oracle空间分配的最小单位.oracle中的块大

Oracle 设置表空间自增长

Oracle修改表空间大小 使用Oracle10g建立数据库后,向数据库中导入了部分数据,第二天继续向数据库中导入数据表时发生错误: 查了很多资料发现原来是Oracle表空间限制,导致无法继续导入数据的原因.如果在建立数据库时没有设置, Oracle 默认的表空间大小为400M,当数据库中数据量达到这个值,再向数据库中导入数据就会报错.解决方法是 扩展表空间.可以选择将表容量扩大,比如扩展到5G,或者当表空间不够时每次自动增加一定的容量,如每次自增200M. 下面列出详细过程: 1.通过sql

Oracle创建表空间和表

创建表空间和表ORACLE物理上是由磁盘上的以下几种文件:数据文件和控制文件和LOGFILE构成的oracle中的表就是一张存储数据的表.表空间是逻辑上的划分.方便管理的.数据表空间 (Tablespace)         存放数据总是需要空间, Oracle把一个数据库按功能划分若干空间来保存数据.当然数据存放在磁盘最终是以文件形式,所以一盘一个数据表空间包含一个以上的物理文件数据表         在仓库,我们可能有多间房子,每个房子又有多个货架,每架又有多层. 我们在数据库中存放数据,最

[转载]Oracle修改表空间大小

Oracle修改表空间大小 使用Oracle10g建立数据库后,向数据库中导入了部分数据,第二天继续向数据库中导入数据表时发生错误: 查了很多资料发现原来是Oracle表空间限制,导致无法继续导入数据的原因.如果在建立数据库时没有设置, Oracle 默认的表空间大小为400M,当数据库中数据量达到这个值,再向数据库中导入数据就会报错.解决方法是 扩展表空间.可以选择将表容量扩大,比如扩展到5G,或者当表空间不够时每次自动增加一定的容量,如每次自增200M. 下面列出详细过程: 1.通过sql

Oracle tablespace 表空间创建和管理

1.表空间的概述 1. 表空间是数据库的逻辑组成部分. 2. 从物理上讲,数据库数据存放在数据文件中: 3. 从逻辑上讲,数据库是存放在表空间中,表空间由一个或者多个数据文件组成. 2.oracle的逻辑组成 1.oracle 的逻辑结构包含 表 空间 段 区 块 2.数据库是由表空间构成,表空间又是有段构成,段是由区构成,区是由 oracle的块构成,这样做是为了提高数据库的效率 3.作用 A.控制数据库占用的磁盘空间 B dba 可以将不同数据类型部署到不同的位置,这样 有利于i/0的性能,

Oracle Temp 表空间切换

一.TEMP表空间作用 临时表空间主要用途是在数据库进行排序运算.管理索引.访问视图等操作时提供临时的运算空间,当运算完成之后系统会自动清理.当 oracle 里需要用到 sort 的时候, PGA 中 sort_area_size 大小不够时,将会把数据放入临时表空间里进行排序,同时如果有异常情况的话,也会被放入临时表空间 , 正常来说,在完成 Select 语句.create index 等一些使用 TEMP 表空间的排序操作后, Oracle 是会自动释放掉临时段的.注意这里的释放,仅仅是

Oracle 创建表空间,用户,赋值(简装)

一, 1.Oracle 创建表空间,用户,赋值(简装) C:\Documents and Settings\Administrator>sqlplus /nologSQL> conn /as sysdba 2.删除用户drop user username cascade; 3.创建自增表表空间SQL> create tablespace 表空间 datafile 'E:\oracle\product\10.2.0\oradata\表空间.dbf' size 50m autoextend

Oracle的表空间和sqlplus

1.  表空间的概念 以前接触过的数据库都没有听到过表空间这个词,在前一段时间看到Oracle数据库的时候发现表空间无处不在.所以表空间在Oracle数据库中应该是一个很常用并且很重要的概念. 表空间是一种逻辑上的概念,逻辑上的存储单元.那么什么叫做逻辑上的存储单元呢.现在通过两张图来对比 表空间(table space)是Oracle数据库中最大的逻辑结构.从逻辑上说,Oracle数据库是由若干个表空间组成的.表空间与数据库的物理结构有着十分密切的关系,它与磁盘上若干个数据文件相对应. 从物理