当前位置: 首页 > article >正文

Oracle 中的表 ID(OBJECT_ID)段 ID(DATA_OBJECT_ID)

在 Oracle 数据库中,“表”和“段”是两个截然不同的概念,各自承担不同的职责。本文参考《Oracle 内核技术揭秘》一书的相关内容,进行相关实验,


表与段的定义
  • :表从逻辑上说明表的形式,比如表有几列,每列的类型、长度。
  • :段代表实际存储数据的空间。段由一个或多个“区(Extent)”组成,用于为表的数据分配存储空间。

表与段的 ID

Oracle中,每个对象都有一个ID值,表有表的ID,段有段的ID。

  • 表 ID(OBJECT_ID):在 DBA_OBJECTS 视图的 OBJECT_ID 列中显示,创建表时即被分配,且在表的生命周期内通常不变。
  • 段 ID(DATA_OBJECT_ID):在 DBA_OBJECTS 视图的 DATA_OBJECT_ID 列中显示,表示与该表关联的段的标识。
实验示例
1. 创建测试表并查看初始 ID
create table test as select * from dba_objects where 1=2;

select object_name, object_id, data_object_id from dba_objects where object_name='TEST';

输出结果:

OBJECT_NAME  OBJECT_ID  DATA_OBJECT_ID
------------ ---------- --------------
TEST             73632          73632

表的 ID 和段的 ID 初始时一致


2. 插入数据后,段的大小变化

插入数据后,段会分配存储空间:

insert into test select * from dba_objects;
commit;

select sum(bytes)/1024/1024 MB from dba_extents where segment_name='TEST';

输出结果:

MB
----------
        11

DBA_SEGMENTS 视图中同样可以查询段的大小:

select bytes/1024/1024 MB from dba_segments where segment_name='TEST';

输出结果:

MB
----------
        11

3. 删除数据后段大小的观察
delete from test;

select bytes/1024/1024 MB from dba_segments where segment_name='TEST';

输出结果:

MB
----------
        11

结论:执行 DELETE 操作仅删除表中的数据,但并不会释放段所占用的存储空间。

参考:Oracle delete删除数据是否为逻辑删除、新插入数据占用的数据块位置实验 - 墨天轮


4. 使用 TRUNCATE 清空表
truncate table test;

select bytes/1024/1024 MB from dba_segments where segment_name='TEST';

输出结果:

MB
----------
    0.0625

结论TRUNCATE 操作会彻底清空表的数据,并释放大部分存储空间(保留部分最小存储单元)。

此外,TRUNCATE 操作会导致 DATA_OBJECT_ID 发生变化:

select object_name, object_id, data_object_id from dba_objects where object_name='TEST';

输出结果:

OBJECT_NAME  OBJECT_ID  DATA_OBJECT_ID
------------ ---------- --------------
TEST             73632          73633

分析

  • 表的 OBJECT_ID 不变。
  • 段的 DATA_OBJECT_ID 增加了 1,这是因为 TRUNCATE 删除了原段,并重新分配了一个新段。

多次 TRUNCATE 的规律

反复进行数据插入、提交和 TRUNCATE 操作,观察结果:

TRUNCATE 前:
OBJECT_NAME  OBJECT_ID  DATA_OBJECT_ID
------------ ---------- --------------
TEST             73632          73633

TRUNCATE 后:
OBJECT_NAME  OBJECT_ID  DATA_OBJECT_ID
------------ ---------- --------------
TEST             73632          73634

每次 TRUNCATE 后,OBJECT_ID 保持不变,而 DATA_OBJECT_ID 会递增。


结论
  1. 表的 ID(OBJECT_ID)在其生命周期内不会改变。
  2. 段的 ID(DATA_OBJECT_ID)随着段的重新分配而变化。每次 TRUNCATE 表时,Oracle 会删除原有段并重新分配新的段,导致 DATA_OBJECT_ID 增加。
  3. 使用 DELETE 删除数据并不会释放段所占用的存储空间;而 TRUNCATE 操作不仅清空数据,还会释放空间并重新分配最小段。
  4. 在实际使用中,TRUNCATEDELETE 高效,但需要注意其会影响段的存储逻辑(如重置高水位线、重建段)。


http://www.kler.cn/a/413467.html

相关文章:

  • SAAS美容美发系统架构解析
  • 爬虫案例-亚马逊验证码突破
  • idea初始化设置
  • 《进程隔离机制:C++多进程编程安全的坚固堡垒》
  • 【含开题报告+文档+PPT+源码】基于SSM的电影数据挖掘与分析可视化系统设计与实现
  • 水库大坝安全监测之量水堰计应用
  • Android 13 Aosp Settings Android Studio版本
  • 树莓派搭建NextCloud:给数据一个安全的家
  • 如何为 XFS 文件系统的 /dev/centos/root 增加 800G 空间
  • vue实现滚动条滑动到底部分页调取后端接口加载数据
  • JS小模块练习
  • 【Python】 深入理解Python的单元测试:用unittest和pytest进行测试驱动开发
  • Oracle RMAN异机迁移数据库从文件系统至ASM
  • ffmpeg命令详解
  • 《黑神话:悟空》获TGA 2024四项提名,动作捕捉与人脸建模技术如何续写中国游戏新神话?
  • 什么是Web Worker?如何使用Web Worker?
  • Linux系統中修改IP地址詳細教程
  • Elasticseach黑马笔记
  • 【设计模式】【创建型模式(Creational Patterns)】之建造者模式(Builder Pattern)
  • AI助力PPT创作:从手动到智能,打造高效演示