逻辑存储结构-段区块
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库逻辑存储结构
数据库的物理存储结构对应一系列的物理文件,这部分主要描述的是数据存储的实际位置,不过数据如果存储,是以什么结构存储到数据文件中,则取决于数据库的逻辑存储结构.
Oracle数据库在执行操作时,并不是以数据文件为单位,而是从逻辑上定义出一组结构,操作的数据可以一步步细分不同的存储单元,oracle 操作数据的过程,实际上就是对这些不同级别的存储单元进行维护和管理的过程.
--数据库的存储结构分为:段(segment).区(extent)和数据块(block)
段(segment):段是数据库内占用空间的对象.它们使用数据库中数据文件内的空间.一个tablespace对应多个segment,一个segment只能对
应一个tablespace,但可以跨越对应tablespace下的datafiles
--段类型:
●表(table):是数据库中最重要的段,也是数据库内存储数据的最常用方法.表段用于存储非集簇且未分区的表中的数据.表段中的所有
数据都必需存储在一个表空间内.
●表分区(table partition):当一个表的规模很大,且并发操作非常频繁时,可以把这样表划分成若干个分区(partition).而每个分区
驻留在不同的表空间.每个分区的存储参数都可以单独定义.可以通过把每个分区放在不同磁盘上以提高并行操作的能力,从而达到改进系统效率的目的.对于分区表,当一个分区损坏了并不影响其他分区的操作.
提示:要使用分区表,必需使用oracle的企业版分区表的选项(partitioning),oracle提供了大批专门命令来管理和操作分区表.
●簇(cluster):簇与表一样,是一种数据段类型.簇内的行是基于键列值存储的.一个簇可以包含一个或多个表.一个簇的表属于同一个
段并且共享相同的存储特性.可以通过索引或者三列算法来访问集簇表内的行.
提示:簇少用,这样可以减少管理和维护的负担,也可以使跨IT平台的移植变的更加容易.
●索引(index):索引段的目的是加快基于某一特殊(索引关键字)的查询速度,这样查询可以很快查找到某一个表中所需数据的准确位置.
一个特定索引的所有索引记录都记录在一个索引段中.如在吗
果一个表有三个索引,那么就会有三个对应的索引段,
SQL> conn erm/erm
Connected.
SQL> select * from tab;
no rows selected
SQL> select segment_name,segment_type from user_segments; <==使用user_segments视图查看段类型(segment_type) no rows selected
SQL> create table t (id int primary key,name char(10)); <== 此表里有一个主键,建立主键自动创建索引.
Table created.
SQL> select segment_name,segment_type from user_segments;
SEGMENT_NAME SEGMENT_TYPE
------------------------------ ---------------
SYS_C005144 INDEX <==t表主键的索引段
T TABLE
●索引分区(index partition):当在一个大型或超大型表上创建索引时,那这个索引也可能很大,所以也可以像分区表一样,将该索引划
分为若干个分区,每个索引分区为一单独的段.这样一个索引可以分布在不同的表空间上.但每个索引分区(段)只能存放在一个表空间中.
●索引表(index-organized table):如果用户的查询主要是基于索引关键字,那么在索引树的叶子节点中的数据行的地址部分可以存放
真正的数据,这种存储结构称为索引表.
索引表优点:可以大大的加快基于索引关键字的查询
索引表缺点:索引表这种存储结构不适合DML(数据操纵语句)操作非常频分的表
DML语言不隐含commit语句的,因此需要用户手动提交对数据库的修改.
●临时段(temporary segment):当在SQL语句中使用了诸如ORDER BY,GROUP BY或DISTINCT等语句或关键字时,oracle就要试着在内存中
进行排序,如果内存中排不下就把中间的结果写到磁盘上,该磁盘区就是临时段.
●还原段(undo segment):还原段9i之前称为回滚段(rollback segment),用来存放事务(transaction)对数据库所做的改变.oracle涉及
到一致性读操作.也就是当一个用户对一个表进行修改,而这时另一个用户对表做DML操作时,对任何数据块或索引块改变之前,所有的原始值都将存放到还原段中.这样做不但允许用户可以还原所做的变化,而且还可以在另一个用户对数据进行DML操作的同时,允许对该行数据进行读操作(读的是存放到还原段的原来的数据)
●大对象段(LOB segment):大对象(LOB)数据类型是从8i开始引入的,用户存储例如大的正文文档,图像或音像信息的.在一个表中可以有
一列或多列LOB数据类型.如果LOB类型的列很大.oracle就会将该列的值单独存放在另一个段中,该段就称为大对象段,在表中只包含一个指向相应大对象数据的指针(地址)
●嵌套表(nested table):嵌套表是一种特殊表,该表中某一列又由一个用户定义的表组成,即表中套表,被称为嵌套表的内表呗存放在另
外一个段中嵌套表少用
●自举段(bootstrap segment):是在数据库被创建时由sql.bsq脚本创建,也被称作为高速缓存段.自举段DBA无法查询或修改,并且不需
要dba维护.
--存储子句优先级:
●段级别定义了存储参数,将大于表空间定义的存储参数,但表空间一级的参数MINIMUM EXTENT或UNIFORM SIZ除外.
●当段没有显示的定义存储参数,将默认为表空间一级做定义的参数
●当表空间一级没有显示的定义存储参数,则使用oracle系统默认的存储参数
注意事项:
●如果指定了表空间的最小区(minimum extent)大小,则该大小适用于将来分配给该表空间内段的所有区.某些参数不能在表空间一级
定义,而只能在段级别定义
●如果对存储参数进行了修改,新的存储参数只适用于还没有分配的区
--区的管理
区是表空间内某个段使用的一块空间,它是由连续的oracle数据块组成.
引入区的目的:为了提高系统的效率,利用区来进行磁盘空间分配可以大大的减少磁盘分配的次数.oralce的磁盘分配算法是一个递归算法.而递归算法效率本身就比较低,减少磁盘分配的次数,也就等于减少了该递归发`算法使用的次数.