Oracle数据库表存储基本概述

Oracle数据库表存储基本概述

Oracle 数据库使用表空间中的数据段保存表数据。段包含由数据块组成的扩展盘区。

表数据段位于表所有者的默认空间中,或CREATE TABLE 语句中所指定的表空间中。

表组织

默认情况下,表按堆的形式来组织数据,这意味着数据库将行存放在最适合他们的位置,而不是按用户指定的顺序来存放。因此,堆组织表是一个无序的行的集合。当用户往其中添加行时,数据库将行置于在数据段中第一个可用的空闲空间。不能保证行按照插入它们的顺序进行检索。

列顺序

列的顺序对于表中的所有行都是相同的。通常,数据库按它们被列在CREATE TABLE 语句中的列顺序来存储列,但这个顺序是不保证的。例如,如果表中有 LONG 类型的列,那么数据库总是将其存储到行中的最后一列。此外,如果向表中添加一个新列,则新列将被存储为最后一列。

与常规列不同,表可以包含虚拟列,它不占用磁盘上的空间。数据库通过计算一组用户指定的表达式或函数,在虚拟列中按需派生一个值。可以对虚拟列创建索引、 收集统计数据、并创建完整性约束。因此,虚拟列非常像非虚拟列。

行存储

数据库将行存储在数据块中。在表中,少于 256 个列的行,被存储在一个或多个行片中。

数据库尽可能将每一行作为一个行片来存储。但是,如果所有的行数据不能插入到一个单一数据块中,或者对现有的行的更新导致行溢出,则数据库使用多个行片来存储此行。

备注:表簇中的行除了包含非聚集表中的行相同的信息,还包含对其所属簇键的引用信息,后续文章单独介绍。

行片Rowids

rowid 实际上是行的一个 10 字节的物理地址。

堆组织表中的每一行都有一个在该表中唯一的 rowid,与一个行片的物理地址相对应。

对于表簇,处于同一个数据块的不同表中的行可以有相同的rowid,后续文章单独介绍。。

Oracle 数据库在内部使用 rowids 来构建索引。例如,在 B 树索引中的每个键与一个指向关联行地址的 rowid 相关联,以便快速访问。物理 rowids 提供对表行尽可能最快的访问,使数据库几乎只需单次I/O 就可以检索到行。

表压缩

数据库可以使用表压缩来消除数据块中的重复值。

对于数据高度冗余的表,压缩可以节省磁盘空间,减少数据库高速缓存中的内存使用,并在某些情况下可以加快查询执行速度。

表压缩对数据库应用程序是透明的。

Oracle 数据库支持两种类型的表压缩:基本表压缩和OLTP 表压缩

基本表压缩

这种类型的压缩只能压缩由直接路径加载插入的数据,只支持有限的数据类型和 SQL 操作。

OLTP 表压缩

这种类型的压缩用于 OLTP 应用程序,并可压缩任何 SQL 操作的数据。

数据库以行主要格式存储压缩行。一个行的所有列都存储在一起,接下来是下一行的所有列,依次类推。

重复值被替换为一个存储在块开始处的符号表短引用。因此,重新创建未压缩数据所需的信息存储在数据块本身中。

压缩的数据块看起来跟正常的数据块差不多。在常规数据块上能正常工作的大多数数据库功能,也可以在压缩的数据块上正常工作。

空值存储

空值是指在某个列中值的缺失。空值表示缺少、 未知、或不适用的数据。

在数据库中,如果在空值的前后都有数据值,则空值会被存储。在这些情况下,他们需要 1 个字节来存储列的长度(零)。

尾随的空值在行中不需要存储,因为新的行头标志着前一行中的剩余列都为空。例如,如果表的最后三列为空,则不为这些列存储数据。

相关推荐
为什么不问问神奇的海螺呢丶7 小时前
Oracle Golden Gate 19c 微服务版 (19.1.0.0.4) 静默安装
数据库·微服务·oracle
NineData8 小时前
使用NineData实现MySQL异地多活场景
运维·数据库·mysql
森叶8 小时前
逻辑仲裁者:实现多事件关联匹配与事务原子化后执行逻辑的技术方案
数据库·oracle
Navicat中国8 小时前
北京理工大学推荐 Navicat | 高校教育行业应用案例
数据库·navicat·高校·教育版
素玥8 小时前
实训7 json文件数据用python导入数据库
数据库·python·json
Rick19938 小时前
Redis 底层架构图
数据库·redis·缓存
ZC跨境爬虫8 小时前
海南大学交友平台开发实战 day9(头像上传存入 SQLite+BLOB 存储 + 前后端联调避坑全记录)
前端·数据库·python·sqlite
Trouvaille ~9 小时前
【MySQL篇】内置函数:数据处理的利器
数据库·mysql·面试·数据清洗·数据处理·dql·基础入门
迦南的迦 亚索的索9 小时前
PYTHON_DAY20_数据库
数据库·oracle