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

ops/2024/11/30 1:33:22/

在 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          73633TRUNCATE 后:
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.ppmy.cn/ops/137793.html

相关文章

AWS账户是否支持区域划分?

在云计算的世界中,亚马逊网络服务(AWS)凭借其全球化的基础设施和丰富的服务选项受到许多企业和开发者的青睐。一个常见的问题是:AWS账户是否支持区域划分?为了回答这个问题,我们九河云一起深入了解AWS的区域…

『 Linux 』数据链路层 - MAC帧/以太网帧

文章目录 MAC帧/以太网帧局域网的通信原理 MAC帧/以太网帧 MAC帧也叫做以太网帧,通常情况下MAC帧也是一个更广义的语术,用来描述数据链路层,即OSI模型的第二层的一种数据帧格式,这种格式包括其他如WI-FI,令牌环,帧中继等数据链路层所使用的数据帧; 以太网帧是具体使用的一种MAC…

MySQL 启动失败问题分析与解决方案:`mysqld.service failed to run ‘start-pre‘ task`

目录 前言1. 问题背景2. 错误分析2.1 错误信息详解2.2 可能原因 3. 问题排查与解决方案3.1 检查 MySQL 错误日志3.2 验证 MySQL 配置文件3.3 检查文件和目录权限3.4 手动启动 MySQL 服务3.5 修复 systemd 配置文件3.6 验证依赖环境 4. 进一步优化与自动化处理结语 前言 在日常…

泷羽sec---shell作业

作业一 写计算器 使用bc命令 需要进行安装bc 代码如下: #!/bin/bash echo "-----------------------------------" echo "输入 f 退出" echo "可计算小数和整数" echo "用法如:1.12.2" echo "------…

重塑视频新语言,让每一帧都焕发新生——Video-Retalking,开启数字人沉浸式交流新纪元!

模型简介 Video-Retalking 模型是一种基于深度学习的视频再谈话技术,它通过分析视频中的音频和图像信息,实现视频角色口型、表情乃至肢体动作的精准控制与合成。这一技术的实现依赖于强大的技术架构和核心算法,特别是生成对抗网络&#xff0…

【二分查找】力扣 2529. 正整数和负整数的最大计数

一、题目 二、思路 基本的二分查找模板是进行查找大于等于 target 值的第一个位置。统计负数个数转换为:查找 0 的位置。统计正数个数转换为:数组总个数 - 查找 1 的位置。 三、题解 class Solution {public int maximumCount(int[] nums) {int n nu…

简单线性DP

数字三角形--简单线性DP 题目链接:数字三角形 解题代码: import java.io.BufferedReader; import java.io.InputStreamReader;public class Main {static int N510;static int INF (int) -1e9;static String[] q;static int[][]fnew int[N][N];static …

Flink 安装与入门:开启流式计算新时代

在当今大数据蓬勃发展的时代,数据处理的时效性愈发关键。传统基于先存储再批量处理的数据方式,在面对诸如网站实时监控、异常日志即时分析等场景时,显得力不从心。随着 5G、物联网等技术的兴起,海量数据如潮水般涌来,且…