逻辑存储结构

 

oracle为数据分配逻辑空间,也就是表空间、段、extentdata blocks。在物理层次上数据是存储在数据文件中的。

 

logical:

tablespace -> segement -> extent -> oracle data block 都是一对多的

physical:

data file -> os block 一对多

 

tablespace -> datafile 一对多

datafile -> extent 一对多

oracle data block -> os block 一对多

 

 

 

 

Data block

Extent:一组逻辑上连续的data block

Segment: 为一个数据库对象分配的一组extent,比如表。

在一个表空间中,一个段可以包含来自不同数据文件的extents。一个extent不会跨越多个数据文件。

 

表空间的管理有两种类型:

Locally managed tablespace (default):用表空间中的一小块空间,建立位图,管理extent

Dictionary-managed tablespaces: 用数据字典来管理extents.因为对数据字典的访问是串行的,所以这种方式可能有性能问题。

 

Locally managed tablespace:在数据文件头重维护一个位图,追踪数据文件体重的空闲空间和使用空间。每一个位对应一组block。用位的值来表示该空间是分配还是释放了。

1.避免了使用数据字典管理extents

2.自动追踪临近的空闲空间。

3.自动决定extent的大小

Oracle强烈推荐使用locally managed tablespaceAutomatic Segment space management.

 

--locally managed tablespace -- automatic segment space management

                                                -- Manual segment space management

--Dictionary-Managed tablespace

 

ASSM (automatic segment space management) 使用位图管理空间。只需要制定一个关键参数PCTFREE,制定了需要为一个block保留多大的空间。 ASSMMSSM提供了更好的并发性,效率更好,是locally managed tablespace的缺省配置。

 

MSSM用一个链接表来管理剩余空间,里面链接了所有的free blocks。除了PCTFREEMSSM还需要你提供其他参数,例如PCTUSED, FREELISTS等等。

 

 

Data blocks: oracle分配空间的最小单位。

DB_BLOCK_SIZE参数制定了缺省的data block size。除非重建数据库,该值不能改变。如果没有指定该参数值,那么大小和操作系统相关,一般是4k8k

 

你可以创建表空间,使用不同的block size值。这个对移动一个transportable tablespace到其他平台有用。

Data block有一个固定的结构,大概分为Block overhead, free space, row data

Block overhead包含block header, table directory, row directory

Block header中包含一些块信息,比如磁盘地址,段类型。对于事务管理的块,还包含了活动的和历史的事务信息。对于每个更新该块的事务,有一个事务纪录,放在 header 的预留空间中。

对于堆组织表,这个directory包含了将数据放在该block中的那些表的元数据。多个表可以将数据放在同一个block中。

Row directory指向该块的数据部分的行地址,是不断往上加的(类似high watermark的概念)。

 

在真实存储数据的部分,每行也有自己的格式。一行数据存储在多个row pieces中,每个row piece包含一个row headercolumn data

 

Row header中包含信息:row piece中的列;该行存储在其他数据块中的信息(通常一个数据块的每行只有一个row piece。如果一行数据可以被放进一个数据块忠,那么oracle将该行存储为一个row piece;否则,数据库将该行存储到多个row pieces中);cluster keys for table cluster.

 

Column data中存储实际的数据,其中的列顺序基本上按照create table语句中的顺序,但并不完全一致。对每列,oracle存放了列的长度,和真实的值(根据列的长度才知道怎么读取后面的值)。

 

Oraclerowid去唯一的标识一行。Rowid包含了数据库需要访问该行所具备的一切信息,rowid不是物理的存储在数据库中,而是可以通过文件和block推算出的。

扩展的rowid包含data object number是对每行的物理地址的64位编码:

Data object number (标识段)+ relative file number + block number file中的block号) + row number (标识block中的行)。

 

rowid在某些情况下可能会改变,比如在row movement enabled时,可能因为partition key updates, flashback table operation, shrink table operations等,rowid改变。

 

数据块压缩:

Oracle用表压缩来消除数据块中的重复值。

使用基本的和OLTP表压缩的数据块格式和未压缩块是一样的。不同的是,在块的头部有一个symbol表,记录行和列的重复值。数据库在每一个重复值出现的地方,替换上指向symbol表的指针。

 

数据块的空间管理:

数据库是从下到上的填充数据块的值,所以row datablock header之间的空间增大或者缩小。

 

PCTFREE设置了对一个数据块,最少需要保留的剩余空间百分比。比如设置为20,就表示数据块中至少要保留20%的剩余空间。(LOB数据类型不受该三参数影响)。

 

一些操作会增加剩余空间,比如:

Delete

Update大值变小值

Insert使用了OLTP压缩

 

释放的空间很可能不是连续的,被称为碎片空间。Oracle只在该情况下自动整理碎片空间:

Insert/update语句试图使用一个块中的剩余空间,空间整体够用,但因为分散所以不够。

整理以后,空间还是那么大,但是变成连续的了。

 

有些行太大了,不能放进一个数据块:

1.行第一次insert的时候就放不进去。Oracle会把它放进多个数据库的chain,称为row chaining

2.行第一次可以insert进去的,但后来增长了,原来的数据块放不下,称为row migration。数据库会把整条记录移动到一个新的能装进该行的数据库。原来的行维护一个指针,指向新块,rowid保持不变。

3. 一行有超过255列。

当一个行chain或者migrate后,取数据的i/o会增加,因为数据库比较扫描多个数据库块。Segment Advisor是一个组件,可以识别哪些段有剩下空间,或者有很大剩余空间,或者chain rows太多。

 

EXTENTS盘区

在建段的时候数据库会分配一块初始盘区,即使段中还没有数据。一个盘区只在一个data file中。当这个初始盘区装满后,如果需要更多空间,数据库会给该段分配更多的盘区。分配的算法取决于表空间是本地惯例还是字典管理的。如果是本地惯例,数据库会根据数据文件的位图搜索相邻的空闲块,如果该文件中没有足够空间,则搜索下一个数据文件。一个段中的盘区一般都是在一个表空间,但可能在不同的数据文件中。

 

每个段的第一个数据块中包含了该段中盘区的目录。

 

一个新分配盘区中的块,尽管是空闲的,但可能其中有旧数据。ASSM会在需要的时候,对数据块进行格式化。

 

通常来说,如果你不用drop命令,盘区的空间不会释放回表空间。比如你删除了一个表中的所有行,那么数据库不会把这些数据块分配给其他对象。

 

在某些情况下,你可以手动释放空间。Oracle segment advisor根据对象的碎片程度决定是否可以回收空间。以下技术可以释放盘区:

1. Online segment shrink。数据的压缩可以带来更好的缓存使用,在全表扫描的时候读更少的块。

2. 把一个未分区表或者表分区的数据移动到一个新段。

3. rebuild or coalesce index

4. truncate一个表或者表聚簇

5. 释放未使哟内空间。释放高水位线以下的空间。

 

盘区的存储参数,决定了oracle怎么给一个段分配可用空间。

存储参数的作用效果由高到底依次为:

段存储从句

表空间存储从句

Oracle数据库缺省

 

本地管理的表空间可以有统一的盘区大小或者可变盘区大小:

统一盘区,你可以指定一个盘区大小或者使用缺省1M。表空间中的所有盘区使用这个大小。(本地管理临时表空间只能使用统一盘区大小)。

对于自动分配盘区,oracle决定优化的大小。

 

 

SEGMENT

段有不同的类型,包括

表,表分区,表聚簇

LOBLOB分区

索引,索引分区

 

Oracle 缺省情况下延迟段创建。在建表和索引(11g R2后,包括建分区)时,只更新数据库元数据。当用户往表或分区里插入数据时,数据库才建立段。

你可以用DBMS_SPACE_ADMIN package去管理空对象的段。

(一个表的段和它的索引所在的段可以在不同的表空间中)。

 

在处理一个查询的时候,oracle经常会分配一个临时段,为排序,hashmerging bitmap 提供空间。建立索引的时候,也会把索引段放到临时段里面,当索引建立完全了,在放到索引段。

如果操作在内存进行,那么不需要临时段。

数据库会在分配给用户的临时表空间里创建临时段。因为临时段的分配和释放多很频繁,所以最好为临时段分配一个单独的临时表空间。这样也可以避免引起其他表空间的碎块。

 

Oracle也会为临时表和索引分配临时段。

 

Undo Segement

作用:回退到一个active transaction

恢复一个被终止的事务

提供读一致

进行逻辑flashback

 

Undo数据放在undo表空间中。Oracle提供了automatic undo management mode来管理undo表空间中的段和空间。

 

事务开始后,数据库会把该事务绑定到一个undo段,和在当前undo表空间中的事务表。概念上来说,undo段中的区组成了一个环,事务按次序循环写undo区。

多个事务可能同时写一个undo区,但每个data block只包含一个事务的数据。

 

在事务把当前区写满后,会看下一个区是否可用。如果下一个区不包含active transaction中的数据,那么就会使用该区。然后所有需要空间的事务都会写这个区。

否则,该区包含了active transaction的数据,那么数据库分配一个新区。

 

Segment Space and the High Water Mark

高水位线是段中的一个点,它以上的数据块没有被格式化,且从来没被用过。

 

MSSMfree list来管理段空间。表建立的时候,段中的块都没被格式化。当一个进程第一次往表里插入数据时,数据库查询free list中的未被使用的块。如果没有块可以用,它就预格式化一组块,把它们放到free list中,然后往块里插入数据。在MSSM中,一个全表扫描读取HWM下的所有块。

 

ASSM不使用free list。当一个进程第一次插入数据,数据库格式化一个位图块,这个位图追踪段中块的状态,代替free list。数据库用畏途去查询可用块,然后在插入数据之前,格式化该块。

 

ASSM中的每个数据块都只能处于以下状态:

HWM之上:未被格式化,从未被使用

HWM之下:分配过,但当前未被格式化未被使用;格式化,包含数据;格式化,空,因为数据被删除。

 

Low HWM: 其下所有数据块都被格式化了,或者当前有数据,或者曾经有数据。

Low HWMHWM之间的数据块可能被格式化了,也可能没有。

Low HWM对于全表扫描很重要。数据库在全表扫描时,会读取low HWM下的所有块,然后又选择的读取low HWMHWM之间的格式化的块。

low HWMHWM之间的块都写满了,HWM会往右走,low HWM会走到HWM之前的位置。HWM会一直走,除非rebuild, truncate, or shrink the object

 

在手动段空间管理(Manual Segment Space Management)中,段中只有一个HWM,但是在Oracle9iRelease1才添加的自动段空间管理(Automatic Segment Space Management)中,又有了一个低HWM的概念出来。为什么有了HWM还又有一个低HWM呢,这个是因为自动段空间管理的特性造成的。在手段段空间管理中,当数据插入以后,如果是插入到新的数据块中,数据块就会被自动格式化等待数据访问。而在自动段空间管理中,数据插入到新的数据块以后,数据块并没有被格式化,而是在第一次访问这个数据块的时候才格式化这个块。所以我们又需要一条水位线,用来标示已经被格式化的块。这条水位线就叫做低HWM。一般来说,低HWM肯定是低于等于HWM的。

 

 

Tablespace

表空间是段的逻辑容器。在物理层次上,表空间的数据在data files中。

 

一个数据库必须有SYSTEM, SYSAUX两个表空间。

 

永久表空间

每个用户都被分配一个缺省的永久表空间。为用户和应用建立一个单独的表空间有很多好处:

控制磁盘空间分配

为用户指定quota

单个表空间上下线不会影响整个数据库的可用性

对单个表空间进行备份和恢复

oracle data pump倒入倒出数据

建立一个transportable表空间,你可以从一个数据库拷贝或者移动到另一个数据库。

 

SYSTEM表空间被SYS用户own。包括内容:

数据字典

包含administrative信息的表和索引

编译对象,比如触发器,过程,包

 

SYSTEM表空间的管理和其他表空间一样,但有更多限制,比如你不能重命名或者drop掉它。

 

缺省的,oracle会把所有新建的用户表空间设置为本地管理的。如果SYSTEM表空间是本地管理的,那么其他表空间不能字典管理。如果手动执行命令CREATE DATABASE,接受缺省参数,那么系统表空间是字典管理的。

Oracle建议使用Database configuration assistant (DBCA)建立数据库,这样所有的表空间,包括SYSTEM,都是缺省本地管理的。 

 

SYSAUXSYSTEM的辅助表空间,为不在SYSTEM表空间中的数据,提供了存储。很多数据库组件,比如OEM, oracle streams缺省的都在SYSAUX表空间中。

一般数据库操作中,不允许SYSAUX drop or renamed。如果它不可用了,那么数据库核心功能可以用,但oem之类的不可用。

 

Undo表空间的管理是automatic undo management modeoracle会自动调优,提供最好的undo数据保留时间,来满足长时间查询。

oracle数据库安装的时候,undo表空间自动建立。

数据库可以有多个undo表空间,但在一个给定时刻,只能有一个在使用。当一个实例打开时,oracle自动选择一个可用undo表空间。如果没有,那么就会把undo数据放在SYSTEM表空间中。

 

Undo retention periodoracle保留老的undo数据的最短时间。这个数值很重要,因为长时间的查询需要使用老undo数据来提供读一致性。

通常来说,当然越长约好。当一个事务提交后,undo数据就不再需要了。

Oracle会收集使用情况统计信息,然后调整retention periodundo 表空间的大小。

如果undo表空间配置了AUTOEXTEND选项,并且最大size没有指定,那么oracle会在空间许可的情况下,把retention period调整的比最长查询所需的长一点。

 

Temporary tablespace

Oracle把临时表空间的数据放在temp files中。

临时表空间可以提高多个排序操作的并发性。

SYSTEM表空间本地管理时,建库的时候会建立一个缺省的临时表空间。一个本地管理的SYSTEM表空间是不能存放临时数据的。

 

Tablespace Modes:

Read/write mode:可写可读,SYSTEM, SYSAUX, temporary肯定是这个模式。

Read-only mode: 只可读,这种表空间一般在可读不可写媒介上,比如DVD等。这种表空间不需要备份和恢复的。

 

表空间可以online或者offlineSYSTEMtemporary 表空间不能offline

一个表空间可以自动或手动的go offline.比如你可以将它offline来做备份或恢复.当有错误发生,比如DBWn写文件失败的时候,数据库会自动的把表空间下线.

 

当一个表空间下线时,数据库:

不允许对该表空间中的对象进行DML操作

正在运行的事务中,有已经运行完的语句指向该表空间中的对象,不被影响

这些已完成语句的undo数据绘放在SYSTEM表空间中.当数据表空间在线后,在根据需要把undo数据应用其上.

 

表空间要么是a bigfile tablespace要么是a smallfile tablespace.区别:

一个smallfile表空间可以包含多个数据文件或临时文件,但文件不能太大.(缺省)

一个bigfile表空间包含一个非常大的数据文件或临时文件.这个可以:

1.增大数据库容量,一个数据库的数据文件数量是受限的.

2.不需要管理很多文件

3.磁盘空间管理的单元变成了表空间而不是单个的文件.

Bigfile表空间仅在ASSM,本地管理表空间支持.不过本地管理的undo和临时表空间可以是bigfile 表空间,尽管段是手动管理的.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11903161/viewspace-682385/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/11903161/viewspace-682385/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值