数据库——表空间-——数据文件
数据库逻辑上是由表空间构成的,物理上是由数据文件构成的。我的理解就是表空间实际上就是逻辑与物理之间的一个桥梁, 避免用户直接对数据文件进行操作。创建表空间的语句有一大串字句。对这个东西加深点理解对一个dba来说还是很有必要的。
创建数据表空间:
create tablespace testmvb
datafile '/u01/oradata/testmvb.dbf' size 100m autoextend on next 100m maxsize 300m
extent managent local autoallocate
segement space management auto;
第一行指出创建一个名字为testmvb的表空间。
第二行指定表空间包含的数据文件,和数据文件的大小,自动扩展,最大大小。
第三行是指它的盘区管理策略。local的意思是本地管理。与之对应的是dictionary数据字典管理。所谓本地管理的表空间的意思:表空间在数据文件头部增加了一个位图区,用来存储盘区的使用状况,当一个盘区被使用,或者被释放以重新使用的时候,这个位图被更新。而数据字典管理的表空间情况下,盘区的使用情况是存储在数据字典中的。与数据字典管理的表空间相比本地管理的表空间有很大的好处。
1可以避免对数据字典的串行访问,增加并行度。
2避免对数据字典的更改,减少日志的生成。
3自动跟踪盘区中的空闲块,减少了手动合并空闲空间的需要。
4区的大小可以由数据库来指定,或者由用户指定一个具体的大小,避免碎片问题。
5避免了递归的空间管理操作。
在ORACLE8i以后的数据库中,所有的表空间包括系统表空间和临时表空间,都可以使用本地管理。就像tom所说。当数据字典管理的表空间不存在,全部用本地管理的表空间。但是默认的情况下,系统表空间仍然是数据字典管理的。
在local 后面跟的autoallocate指定盘区分配的方式是数据库指定的,数据库决定新分配的盘区的大小。然而你也可以指定一个固定大小,例如使用uniform. 16m指定每一个分配的盘区都是16m.
指定auto的时候。
第三行知的是段空间管理策略。
什么是段呢。段是由盘区组成的,可以跨越多个数据文件。由三种。数据段(data segment),索引段(Index Segment),回滚段(Rollback Segment).这里我们只讨论数据段和索引段,从某种意义来讲,段为一个表空间的一个对象提供存储,一个非分区表在表空间里的存储是一个段。一个分区是一个段。一个索引也是一个段。段可以跨数据文件,但是不能跨盘区。在一个段里。存储策略是一样的。
ASSM是ORACLE 9I引入的新特性。通过使用位图freelist取代传统单向的链接列表freelist,ASSM的tablespace会将freelist的管理自动化,并取消为独立的表格和索引指定PCTUSED、FREELISTS和FREELIST GROUPS存储参数的能力。
说到这里又不能不讲讲PCTUSED,FREELIST的概念。打个比方pctfree是20,pctused=60,在空块的状态下,可以一直插入这个块。直到行数据加上管理开销占了块的80%,这个时候自由列表标记块为used,好了,现在有20%的空间没有用。那这个空间干吗用呢。留着为以后扩展用。更新块中的row让数据变大了,那就要使用这个空间了。如果以后删除行或者行变小了呢。好说:一直可以删到40%。这个表还是used的。到39%的时候,这个块就被标记成free了。在10g中这两个参数仍然可以使用。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10522540/viewspace-198240/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10522540/viewspace-198240/