盒子
盒子
文章目录
  1. 一.数据块
  2. 二.数据块结构
  3. 三.分区(Extents)

Oracle 逻辑结构详解

Oracle 的逻辑结构包括表空间 (Tablespace)、数据段(Sgement)、分区(Extents)、数据块(Block)。

一.数据块

磁盘的最小存储单位是Sector。Oracle 数据库的最基本存储单位是 数据块,每个数据块是由磁盘上连续的 Sector 组成的。数据块的大小是由初始化参数 DB_BLOCK_SIZE 指定的,通常这个值是8KB ,也可以定义成 2KB 、4KB 、16KB、32KB、64KB 甚至其他值。

在计算机体系结构中,磁盘或者外部存储是速度最慢的外部设备。根据“短板理论”,系统的 性能最终取决于“最短的那块板子——存储”。因此为了提高性能,操作系统都设计有文件系统缓存, 在这种架构下,应用程序的每个读写操作首先是被发送给操作系统,操作系统在缓存中实现请求, 如果缓存中没有请求的数据,操作系统才会去物理磁盘上读取。这个模型对于Oracle 也是一样的, 操作系统对于Oracle 的数据请求会尽量现通过文件系统缓存完成,如果缓存没有请求的数据,才会 对磁盘设备进行物理读写。

Oracle 和操作系统间的数据交互都是以 Oracle 数据块为单位进行的。比如要读取一个数据,即 便这个数据只有一个字符,但是 Oracle 也不会只请求读入一个字节,而是要读入一个数据块的全部 内容。写操作也一样,每次写入磁盘的都是一个数据块,即便这个数据块中只有一个字节发生了变 化。而操作系统和存储设备间的交互是依据磁盘数据块为单位进行的。因此在创建Oracle 数据库时, Oracle 数据块的大小应该尽量定义成磁盘数据块大小的整数倍,这可以避免浪费 IO。

DBA需要在建库之初就规划好数据块的大小,因为一旦完成创建数据库,数据块的大小就不能 改变了。设计数据块大小通常要结合应用类型考虑,并没有一个绝对的标准。通常来说对于OLTP 类型的应用,8KB 大小就比较合适,这也是 Oracle 创建数据库时使用的默认值,对于 OLAP 或数据 仓库,数据块的大小可以大一些,比如16KB、32KB、64KB。

Oracle 10g并不强制所有的表空间都使用同一种数据块大小,一个数据库内可以同时拥有2KB 、 4KB 、8KB 、16KB、32KB 这5 种数据块大小的表空间。比如创建数据库时选择了 8KB 作为 DB_BLOCK_SIZE ,这就意味 8KB 是这个数据库的标准数据块大小,系统表空间会使用标准数据块 尺寸创建。而用户表空间可以使用其他数据块大小,但是要在一个数据库内同时是用多种数据块的 表空间,对应的内存 Cache 也需要配置。这些内存 Cache 的参数是 DB_2|4|8|16|32K_CACHE_SIZE。

二.数据块结构

数据块是数据的最终归宿,每个数据块从前向后可以分成 4 个 部分:数据块头(Block Header)、Row Directory 、Free Space 和Used Space。

三.分区(Extents)

分区是Oracle 逻辑结构中的第二个层次,连续的数据块组成了一个分区,这个结构仅是用于为 便于空间管理,包括空间的分配和释放。

当用户创建表、索引等需要占用磁盘空间的对象时,Oracle 要为这个对象分配一块磁盘空间作 为存储空间,这块空间叫做段(Segment),段是下一节的内容。而段的空间不是以数据块为单位分 配的,是以分区为单位分配的。以后随着数据的不断插入,最初分配的分区空间会有用尽的时刻, 这时就要空间扩展,以容纳更多的数据。这个空间扩展活动同样是以分区为单位,而不是以数据块 为单位进行的。

如果不使用分区,每次 Oracle 分配空间是就需要分配成百上千个数据块,而使用分区之后,因 为分区是一个连续的空间,只需要知道起、始两个数据块就可以定位一个分区。所以,Oracle 对空 间的分配效率就只和分区的数量有关系,而和数据块的数量没有关系。而且分区的大小可以很灵活, 既可以设置为固定大小的,也可以设置成递增的,无需强制一致,所以即便是很大的数据表,其分 区的数量也可以控制得很少,但是数据块的数量却很多,Oracle 建议一个段里分区的数量不要超过 024。对于释放空间,分区也是基于同样的原因提高效率。

正因为对象的空间分配与释放是以分区为单位进行的,从这个意义上讲,分区的意义是简化空 间管理的复杂性。

支持一下
扫一扫,支持forsigner