这次的笔记将描述了Oracle数据库服务器中逻辑存储结构的段,区,块的本质和相互关系。
1.介绍数据段、区段和段
2.段概述
3.区概述
4.数据块概述
a.数据库由一个或多个表空间组成。
b.表空间由一个或多个数据文件组成。
c.段(table、index等)由一个或多个区组成。(可以理解“段”就是表)
d.区是文件中一个逻辑上连续分配的块(block),区是ORACLE中最小的分配单元,但区所在的数据文件并不连续的,甚至是跨磁盘分区的,一般一个段至少有一个区。
f.Oracle存储数据的最小单位是数据块。默认是8K
----------段概述 segment
----(在刚开始时,我理解为“段”就算是“表”,虽然有差误,但却有利理解oralce的存储结构)
数据段是一系列区间 , 在这个特定逻辑存储结构存储的数据都在一个表空间内 . 例如对于每一种数据库 对象 ( 表、索引 ) ,数据库都会分配一个或一段区间构成其对象的数据段。
数据段大致分为以下几种:
1.索引段
2.临时段
3.自动回滚( 撤销) 段
-----索引段
Oracle 数据库中每一个非分区索引都有一个对应的单一的索引段用来保存所有数据。
对于分区索引而言,每一个分区都有一个单一的索引段。
当执行Create Index 语句,Oracle 就会创建相应的索引段。
在创建索引的时候同样也可以指定相应的存储参数。设置这些参数将会直接影响到数据查询和存储的效率。
-----临时段
处理查询的时候,对于 SQL 语句的解析和执行阶段 Oracle 经常需要临时工作区。
例如,PGA中的排序区,当PGA排序区内存满时,便会使用该临时段。
以下语句有时会需要使用临时段:
l CREATE INDEX
l SELECT ... ORDER BY
l SELECT DISTINCT ...
l SELECT ... GROUP BY
l SELECT ... UNION
l SELECT ... INTERSECT
l SELECT ... MINUS
----自动回滚段
自动回滚 ( 撤销 ) 段管理 是基于 undo 表空间的。(目前还是步了解,事物等概念)
-----段的管理方式
自动 Automatic Segmnet Space Management
表空间中的对象将自动管理其空闲空间,这将提高空闲空间管理性能(毫无疑问选择自动管理)
手动 Manual Segment Space Management
手动设置FreeLists、FreeList Groups、PctUsed、其它参数来控制如何分配、使用、重用段空间
-----Oracle表段中的高水位线High Water Mark(HWM)
在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。
水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。
这个HWM是一个标记。
全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没有任何数据。
当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用delete语句删除数据的话,数据
虽然被删除了,但是高水位线却没有降低,而是保持原样。
而select语句扫描的特性是,从表头扫描到HWM标记以下的数据。
(假如段分配了有10万个块,但是实际使用了2000个块,那么高水位线在2000个块的位置,那么如果你访问这个
表的时候,oracle只访问2000个块,如果在10万个块的位置,那么oracle访问表的时候会访问10万个块。)
这样极其浪费时间。
---那如何清除HWM呢?
不妨试试这个
cruncate table table_name;
------------------------------------------------------------------------------------------------------------------
----------区概述 extend
区间是由多个块的存储单元块(block)组成,一个区一般是8个块。当表或索引空间增长时,额外的区便加进来以满
足需求。
----区的管理方式:
数据字典:此乃8I以前的老物,不记。
本地管理:(可以做简单的模拟实验)
1.自动管理:
若为自动管理,则Oracle会按照递增算法来分配空间
2.统一管理:
若为统一管理,可以详细指定每个区间的大小
dba_extents这个视图可以看到哪些对象分配了多少区间
-----------------------------------------------------------------------------------------------------------------
----------数据块概述
Oracle存储数据的最小单位是数据块。Oracle管理数据库数据文件的存储空间被称为数据块。
标准的块大小是通过初始化参数DB_BLOCK_SIZE指定的,Oracle允许指定最多5种非标准块。
为了避免不必要的I/O开销,数据块大小应当是操作系统块大小的整数倍。(如我的Linux系统磁盘ext4文件系统的块大小为4K
,即我的oracle的块大小只能是4K的整数倍)
---数据块格式
块头(公共和变量)
---头部包含了通用块信息,例如块的地址和段的类型(例如表或者索引)
表目录
---这部分信息包含了在这个块中该表或该索引的相关信息。
行目录
---这部分包含了数据块中的实际行的信息(包括行数据区域中每行的地址),一旦数据块头部的这个行目录的空间被
分配了,那么即使该行删除了,这段空间仍然不能回收。
---另外的概念(枯燥无言)
头部信息区(Overhead):块头(header/Common and Variable),表目录(Table Directory),行目录
(Row Directory)这三部分合称为头部信息区(Overhead)。头部信息区不存放数据,它存放的整个块的信息。
可用空间(Free Space):可用空间是一个块中未使用的区域,这片区域用于新行的插入和已经存在的行的更新。
行数据:这部数据块包含了表或索引的数据,行也可能跨数据块,这也就是行迁移现象。
---行链接和行迁移(Row Chaining and Migrating)
行链接(Row Chaining):如果我们往数据库中插入(INSERT)一行数据,这行数据很大,以至于一个数据块存不下一整 行,Oracle就会把一行数据分作几段存在几个数据块中,这个过程叫行链接(Row Chaining)。
行迁移(Row Migrating):数据块中存在一条记录,用户执行UPDATE更新这条记录,这个UPDATE操作使这条记
录变长,这时候,Oracle在这个数据块中进行查找,但是找不到能够容纳下这条记录的空间,无奈之下,Oracle只能把整行数
据移到一个新的数据块。原来的数据块中保留一个“指针”,这个“ 指针”指向新的数据块。
原文:http://www.cnblogs.com/yzhl/p/4226846.html