了解块中表行数据的存储

Oracle数据存储模型

逻辑结构在左,物理结构在右

有一个关系使用虚线绘制,表示段与数据文件的多对多关系。之所以使用虚线表示关系,是因为这种多对多关系不应存在。

表空间实体消除了段与数据文件之间的多对多关系。一个表空间可以包含多个段,而且可以由多个数据文件组成。这意味着,一个段可以分布在多个数据文件中,而任一数据文件可以包含多个段的全部或一部分。

“段”实体表示存储数据从而需要表空间中的空间的任何数据库对象。典型的段是表,但也存在其他段类型,主要是索引段和撤销段。任何一个段可以仅存在于一个表空间中。

Oracle块是数据库的基本I/O单元。数据文件设置为连续编号的oracle块。对于表空间而言,Oracle块的大小固定不变(一般而言,数据库中多有表空间的块大小都是相同的),默认大小是8KB。行可能只有数百个字节,因此,一个块中可能有多个行,但在会话需要行时,将从磁盘将整个块读入到数据库缓冲区缓存中。同样,如果数据库缓冲区缓存中的一行中的一列发生了变化,DBWn最终也将整个块协会到源数据文件中,从而覆盖以前的版本。块大小由DB_BLOCK_SIZE参数控制。在创建数据库后,DB_BLOCK_SIZE用于设置构成SYSTEM表空间的数据文件的格式,所以固定不变。如果后来发现块大小不合适,唯一办法是新建一个数据库,并将所有数据传输到其中。块由数据文件中的编号唯一标识,仅块号是不够的。

如果在管理空间时,每次仅管理一个块,那么将是一项棘手的任务,为此,又将块组合成了区间。区间是一个数据文件中一组连续编号的Oracle块。这些区间可能位于构成表空间的任何或所有数据文件中。可以根据段的维度(区间根据每个段连续编号,从零开始)或数据文件的维度(每个区间在一个文件中,从某个Oracle块编号开头)确定。

段、区间、块和行

数据存储在段中。数据字典视图DBA_SEGMENTS描述了数据库中的每个段。

SYS@ prod>select segment_type,count(1) from dba_segments group by segment_type order by segment_type;

SEGMENT_TYPE         COUNT(1)
------------------ ----------
CLUSTER 10
INDEX 2379
INDEX PARTITION 300
LOB PARTITION 1
LOBINDEX 724
LOBSEGMENT 724
NESTED TABLE 33
ROLLBACK 1
TABLE 1625
TABLE PARTITION 144
TYPE2 UNDO 10 11 rows selected. SYS@ prod>

段类型:

  • TABLE 这些是堆结构的表,其中包含以随机顺序存储的变长度的数据行。虽然典型的段是表段,但要注意,不能说表就是段,还有更复杂的表组织使用其他段类型。
  • INDEX 索引是键值的有序列表,相应的指针ROWID指向每行的物理位置。ROWID指定行位于哪个数据文件的那个Oracle块中,并指定行在块中的编号。
  • TYPE2 UNDO 这些是撤销段(不能讲它们称为“type2 undo”段),存储数据的更改前版本,为了提供完整性(回滚,读取一致性和隔离),这些是必需的。
  • TABLE PARTITION 可以将表分成多个区。如果这样的话,分区将称为一个个的段,而表本身完全不是段:仅以分区综合的形式存在。堆表的每个表分区在本身的表段中,成为堆表结构。这些段可能使用不同的表空间,这意味着,可以将一个表分布到多个表空间中。
  • INDEX PARTITION 默认方式下,一个索引在一个段中,但是,也可以对索引进行分区。如果对表进行分区,通常也会对这些表上的索引进行分区。
  • LOBSEGMENT、LOBINDEX、LOB PARTITION如果将列定义为大对象数据类型,那么,仅在表本身存储一个指针,此指针指向列数据实际所在的不同段中的条目。LOB可以拥有在此基础上构建的索引以便快速访问对象中的数据,另外,可以对LOB进行分区。
  • CLUSTER Cluster段包含多个表。分区将一个表分布在多个段中,而Cluster与此相反,允许将多个表反规范化(denormalize)为一个段。
  • NESTED TABLE 如果将一个表列定义为本身就具有列的用户定义的对象类型,那么,列可以作为嵌套表,存储在自身的段中。
  • ROLLBACK

每个段都有一个或多个区间。创建段时,Oracle将在指定的任何表空间中为其分配区间。最后,随着数据的输入,区间将被填满。此后,Oracle将在同一表空间(但不一定在同一个数据文件中)分配第二个区间。如果知道段需要更多空间,则可以手动分配区间。如何精确地确定段的位置:

SYS@ prod>create table scott.newtab(c1 date) segment creation immediate;

Table created.

SYS@ prod>select tablespace_name,file_id,extent_id,block_id,blocks,bytes
2 from dba_extents where owner='SCOTT' and segment_name='NEWTAB'; TABLESPACE_NAME FILE_ID EXTENT_ID BLOCK_ID BLOCKS BYTES
------------------------------ ---------- ---------- ---------- ---------- ----------
USERS 4 0 528 8 65536 SYS@ prod>alter table scott.newtab allocate extent; Table altered. SYS@ prod>select tablespace_name,file_id,extent_id,block_id,blocks,bytes
2 from dba_extents where owner='SCOTT' and segment_name='NEWTAB'; TABLESPACE_NAME FILE_ID EXTENT_ID BLOCK_ID BLOCKS BYTES
------------------------------ ---------- ---------- ---------- ---------- ----------
USERS 4 0 528 8 65536
USERS 4 1 536 8 65536
SYS@ prod>select tablespace_name,file_name from dba_data_files where file_id=4; TABLESPACE_NAME
------------------------------
FILE_NAME
------------------------------------------------------------------------------------------------------------------------------------------------------
USERS
/u01/oradata/prod/users01.dbf SYS@ prod>

第一个命令完全依赖于存储的默认设置创建表SCOTT.NEWTAB。此后,针对DBA_EXTENTS的查询显示此段仅包含一个区间(区间编号0)。此区间位于文件编号4中,长度为8个块。在8个块中,第一个块的编号是528。区间大小是64KB,块大小是8KB。下一个命令强制Oracle在即使第一个区间不满的情况下将另一个区间分配给段。下一个查询显示,此区间编号为1,也在文件编号4中,正好从区间0之后开始。注意,无法从上面例子中清晰地判断表空间是否由多个数据文件组成,这是因为Oracle计算出在何处分配下一个区间的算法并不接着仅使用数据文件。如果表空间确实由多个数据文件组成,则可以使用下列语法重写Oralce的选择:

ALTER TABLE tablename ALLOCATE EXTENT STORAGE (DATAFILE 'filename');

最后一个查询继续查看DBA_FILES来确定区间分配到的文件的名称,以及数据文件所属的表空间的名称。为了确定表的表空间,也可以查询DBA_SEGMENTS视图。

一个区间有一组连续编号的块组成。每个块都包含标题区域和数据区域。标题的大小可变,从块的顶部向下延伸。除了其他信息之外,行标题还包含行目录(列出每行在块中的开始位置)和行锁信息。数据区域按由下而上的方式填充。二者之间可能有空闲空间,也可能没有。

可以导致块标题增长的事件包括插入和锁定行。数据区域一开始是空的,随着在其中插入行(对于索引段的块,将插入索引项),它将变满。随着行的插入、删除和更新(可能导致行大小的更改),空闲空间中会出现碎片,但这无关紧要,因为在将块复制到数据库缓冲区缓存中的缓冲区后,这些都在内存中发生。在必要时,会在DBWn将块写回数据文件之前,将空闲空间接合称一个连续区域。

Oracle 存储结构一的更多相关文章

  1. Oracle 存储结构

    数据库是存储数据的容器,它的主要功能是保存和共享数据. oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的. 逻辑存储结构:oracle内 ...

  2. oracle存储结构

    数据库的物理存储结构 select * from v$datafile; 数据库的逻辑存储结构,从表空间开始查起一个数据库对象的逻辑存储结构如下表空间-段-区-块 select * from dba_ ...

  3. Oracle存储结构-表空间

    表空间 oracle文件注意的问题 控制文件,redolog文件,数据文件----一定要放在存储上 问题:银行用户,集群切换失败,原因是数据库中部分的文件未放到存储上 存储三种组织形式:文件系统.AS ...

  4. Oracle 存储结构三

    Oracle数据库服务器自动管理空间的方法 段空间的分配 空间以区间的形式分配给段,区间是一组连续的Oracle块.每个数据文件都有一个位图,来描述文件中块的状态,块可能是空闲的,也可能是区间中已分配 ...

  5. Oracle 存储结构二

    创建和管理表空间 创建表空间 典型语句: CREATE SMALLFILE TABLESPACE "JWTS" DATAFILE '/u01/app/oracle/oradata/ ...

  6. Oracle存储结构-段区块

    段 一个段建立以后首先会分配一个区,区中包括含8个块,这时执行insert插入数据,当这个区写满后,会在分配一个区 1.一个段建立以后,Oracle如何给段分配区? 2.段分配到区以后,有了空闲空间, ...

  7. Oracle 逻辑存储结构

    一.总述 逻辑存储结构是 Oracle 数据库存储结构的核心内容,对 Oracle 数据库的所有操作都会涉及逻辑存储结构.逻辑存储结构是从逻辑的角度分析数据库的组成,是对数据存储结构在逻辑概念上的划分 ...

  8. 学习笔记:oracle学习一:oracle11g体系结构之体系结构概述和逻辑存储结构

    目录 1.oracle 11g体系结构概述 1.1 三个重要概念 1.2 oracle数据库存储结构 2 逻辑存储结构 2.1 数据块(Data Blocks) 2.2 数据区(Extent) 2.3 ...

  9. Oracle存储——逻辑结构

    Oracle 数存储——物理结构 Oracle存储结构:物理结构+逻辑结构 Oracle 数据库存储逻辑结构 Oracle Schema Objects(Schema Object Storage A ...

随机推荐

  1. css3 伪元素和伪类选择器详解

    转自脚本之家:http://www.jb51.net/css/213779.html 无论是伪类还是伪元素,都属于CSS选择器的范畴.所以它们的定义可以在CSS标准的选择器章节找到.分别是 CSS2. ...

  2. drupal7 STMP邮件模块配置

    drupal7.54 STMP  version = "7.x-1.6" 配置:   注意:上面的“用户名”需要和“站点信息”页面的电子邮件地址保持一致,邮件发送才能成功 ---- ...

  3. SQL server查找指定表的所有索引

    WITH tmp AS ( SELECT indexname = a.name , tablename = c.name , indexcolumns = d.name , a.indid FROM ...

  4. Angular入门教程三

    4.6指令(directive) 通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的. 模板中可以使用的东西 ...

  5. 浏览器缓存(Web Cache/ Http Cache)

    浏览器缓存(Web Cache/ Http Cache)是前端性能优化中很重要的组成部分. 缓存策略 浏览器的缓存策略是: 1.如果本地没有缓存,则发送非条件性请求. 2.如果本地有缓存,则判断本地缓 ...

  6. vue知识day1

    HTML语义.CSS:样式 js:行为 jQuery:简化了js操作 boostrap :框架 ,以类方式展现 react:facebook 公司的产品 angular:谷歌公司产品 vue:作者尤雨 ...

  7. 平均负载(Load average)

    load average 的含义平均负载(load average)是指系统的运行队列的平均利用率,也可以认为是可运行进程的平均数. top命令中load average显示的是最近1分钟.5分钟和1 ...

  8. Value与Sql Value

    在使用Value作为参数传递给SqlServer时 实际上传递的是SqlValue 为其赋值的一种方式,可以将datetime类型转换成string类型(yyyy-MM-dd HH:mm:ss)

  9. AD账户锁定策略

    AD账户锁定策略在一个域中可以有多套,密码策略只能有一套

  10. 8086 CPU 寄存器简介

    转载:http://www.cnblogs.com/BoyXiao/archive/2010/11/20/1882716.html 引子 打算写几篇稍近底层或者说是基础的博文,浅要介绍或者说是回顾一些 ...