oracle之逻辑数据库结构概述
数据库空间的分配单位有数据块(Data Block),数据扩展(Extent),和段(Segment)。
具体概念可以看:http://hi.baidu.com/feixianxxx/blog/item/8d5429028d05dc091d95838a.html
我这里写几个注意点:
1.块是n块操作系统块。是连续的。数据扩展因为是连续的一组数据块,所以也是连续的,是位于一个数据文件里。段的拓展是以数据扩展为单位的,但是因为数据扩展是随需分配的,所以段不可能是连续的,不一定位于一个数据文件里,但是位于一个表空间。
2.Oracle每次获取数据时,总是访问整数个(Oracle)数据块,而不是按照操作系统块的容量访问数据。所以合理的控制数据块大小对磁盘I/O有很大影响。
3.注意行链接和行迁移:前者当一行数据被插入时一个数据块就无法容纳。在这种情况下Oracle将这行数据存储在段内的一个数据块链(chain)中。在插入数据量大的行时常会发生行链接(row chaining)。后者原本存储在一个数据块(data block)内的数据行,因为更新操作导致长度增长,而所在数据块的可用空间也不能容纳增长后的数据行。在这种情况下,Oracle将此行数据迁移(migrate)到新的数据块中。Oracle在被迁移数据行原来所在位置保存一个指向新数据块的指针。被迁移数据行的 rowid 保持不变。
4.在新分配的数据块中(data block),可用于插入(insert)数据的空间等于数据块总容量减去数据块头(block overhead)再减去预留可用空间(PCTFREE)。而更新(update)数据块内已有数据可使用数据块中的所有可用空 间。
5.对于使用本地管理的表空间,其中所分配的数据扩展(extent)的容量既可以是用户设定的固定值,也可以是由系统自动决定的可变值。 对于固定容量(UNIFORM)的数据扩展,用户可以为数据扩展设定容量或使用默认大小(1 MB)。用户须确保每个数据扩展的容量至少能包含5个数据块(database block)。本地管理(locally managed)的临时表空间(temporary tablespace)在分配数据扩展时只能使用此种方式。对于由系统管理(AUTOALLOCATE)的数据扩展,由Oracle决定新增数据扩展的最佳容量,其最小容量为 64 KB。对于永久表空间(permanent tablespace)上述参数均为默认值。
6.数据扩展如何被分配:首先选择一个属于此表空间的数据文件(datafile),再搜索此数据文件的位图(bitmap)查找连续的数据块(free block)。如果此数据块中没有足够的连续可用空间,Oracle将查询其他数据文件。
7.只要用户没有移除(drop)或清空(truncate)表(nonclustered table)或索引,那么对应数据段(data segment)内的任何数据块(data block)都不会被回收。当然可以重用。
为什么我删除了一个表的数据但是它空间没释放呢?参看oracle的高水位线http://tylgl.javaeye.com/blog/319585
8.涉及到临时段的操作:
CREATE INDEX
SELECT ... ORDER BY
SELECT DISTINCT ...
SELECT ... GROUP BY
SELECT . . . UNION
SELECT ... INTERSECT
SELECT ... MINUS
9.Oracle为查询(query)与临时表(temporary table)分配临时段(temporary segment)的过程是不同的。
为查询分配临时段:Oracle可以在用户的临时表空间(temporary tablespace)内为用户创建临时段(temporary segment)。在语句结束时Oracle负责移除(drop)临时段.为临时表及临时索引分配临时段:当首个 INSERT 执行时,Oracle为临时表及其索引分配临时段,创建索引的root page,同时创建所有的 LOB 段(LOB segment)。当事务或会话结束时,Oracle负责移除属于此事务或会话的临 时表使用的段。
10.对于段的管理,涉及一个自动撤销管理。
作用:
回滚(rollback)一个活动的事务
恢复(recover)一个已结束的事务
实现读完整性(read consistency)
恢复语句的逻辑错误(logical corruptions)
oracle推荐使用自动撤销管理(automatic undo management)模式,但有一个需要注意的问题:一个存在问题的事务(ill-behaved transaction)有可能消耗大量撤销空间(undo space),甚至导致整个系统瘫痪。解决 方法;在资源管理器(Resource Manager)中可以设置 UNDO_POOL 参数,从而以更直接的方式控制大事务(large transaction)的管理。动撤销信息保存周期管理对闪回操作很有深渊意义。
我们再来了解下表空间,它与数据库物理文件紧密相连,也是最重要的逻辑结构。
表空间是一个容器,其中包含有段。每个段都只属于一个表空间。一个表空间中可能有多个段。
表空间本身可以有一个或多个相关的数据文件。表空间中给定段的一个区段完全包含在一个数据文件中。不过,段可以有来自多个不同数据文件的区段。
数据库(database),表空间(tablespace),及数据文件(datafile)关系密切,但是她们又具有以下重要区别:
1.一个Oracle数据库是由一个或多个被称为表空间(tablespace)的逻辑存储单位构成的,这些表空间共同用于存储数据库的数据
2.Oracle数据库的每个表空间由一个或多个被称为数据文件(datafile)的物理文件构成,这些文件由Oracle所在的操作系统管理。
3.数据库的数据实际存储在构成各个表空间的数据文件中。
关于更多表空间的内容,可以参看:http://hi.baidu.com/feixianxxx/blog/item/8d5429028d05dc091d95838a.html
提几个表空间的点:
1.只有本地管理的(locally managed),且段空间自动管理(automatic segment-space management)的表空间(tablespace)才能使用大文件表空间(bigfile tablespace)。
但是有两个例外:本地管理的撤销表空间(undo tablespace)和临时表空间(temporary tablespace),即使其段(segment)为手工管理(manually managed),也可以使用大文件表空间。
2.使用大文件表空间的几个优势:
a.显著地增强Oracle数据库的存储能力。使用大文件表空间时数据库中表空间的极限个数是使用小文件表空间时的1024倍,当一个Oracle数据库使用大文件表空间,且使用最大的数据块容量时(32K),其总容量可以达到8EB。
b.在超大型数据库中使用大文件表空间减少了数据文件的数量,因此也简化了对数据文件的管理工作.
c.由于数据文件对用户透明,由此简化了数据库管理工作。
3.不建议在不支持大文件的平台上使用大文件表空间,这会限制表空间(tablespace)的容量。如果使用大文件表空间替代传统的表空间,数据库开启(open),checkpoints,以及 DBWR 进程的性能会得到提高。但是增大数据文件(datafile)容量可能会增加备份与恢复的时间。
4.如果数据库中的 SYSTEM 表空间(tablespace)为本地管理的(locally managed),那么此数据库中就不能创建数据字典管理的(dictionary managed)表空间。
5.在自动撤销管理模式(automatic undo management mode)下,每个Oracle实例(instance)有(且仅有)一个撤销表空间。
6.用户可以利用多个表空间(multiple tablespace)完成以下任务:
控制数据库内的磁盘空间分配
为数据库用户设定空间使用配额(quota)
通过将某个表空间置于联机/脱机(online/offline)状态来控制数据的可访问性(availability)
执行对数据库的某部分的备份与恢复
使数据存储可以跨多个设备,提升系统性能
7.本地管理的表空间与数据字典管理的表空间相比有如下优势:
a.易于查找连续的可用空间[此处指数据块],避免了数据扩展合并(coalesce free extents)。
b.能够避免产生递归(recursive)的空间管理操作。
8.用户只能将一个表空间联机到创建她的数据库中,因为只有这个数据库的 SYSTEM 表空间中才保存着与此表空间相关的必要的数据字典信息。一个脱机(offline)的表空间不能被Oracle之外的工具打开或编辑。因此脱机表空间不能被移动到其他数据库中。
9.一个 SQL 语句可以同时使用多个临时表空间(temporary tablespace)进行排序。