ITPub博客

首页 > 数据库 > Oracle > oracle数据结构散记

oracle数据结构散记

原创 Oracle 作者:wanglinghua0907 时间:2024-01-18 13:14:49 0 删除 编辑


Physical 0 a File Oracledata OS ock

物理结构

块(block)-数据文件(data file)


逻辑结构

块(block)-区(extent)-段(segment)-表空间(tablespace)-库(database)

9 乂 BY Z Z 8 BY Z 8 乂 Z Z Z BY Z Z Z S 00 一 8 , 4m20 S 00 一 8 W20 8 Z


上面的块为2k,一般设置8k

单个扩展区不会跨数据文件,但是段可以包含多个数据文件。


块的结构

12-5 Oracle Data Block 8 KB Operating System Blocks 1 KB 1 KB 1 KB 1 KB 1 KB

11g,插入一行,默认分配第一个区,没插数据,空表不分配区

10g,建好,默认分配1个区


块头和位图块

每个文件的前128(0-127)号块是文件头(11g),10g中是0-8号块。11里,0和1号块是真正的文件头,2-127号块

是位图块。10g是1和1号块是文件头,2-8是位图块。


位图块用来记录表空间中区的分配的情况。位图块中的每个二进制位对应一个区是否被分配给表、索引等对象。第一个

二进制位是0说明表空间的第一个区未分配,1就说明已分配,第二个二进制位对应第二个区。


位图块分2个部分,第一个位图块作为位图头(bitmapped file space header)

00 1 ; 1 0000 ] d 0 1 1 1 1 1 00 0 0 “ 图 I-I 位 图 块 示 意 图


标记位

11g位图块2-127号,8x126=1008k字节,每个字节8个2进制,1008x1024x8=8257536个区。


800+w个二进制位中,如何判断哪个可以分配给表?

答案是使用标记位,如果0-2号区被占,那标记位的值为3,如果3-4也被占了,那标记位增加到5,此时2号区被释放了

,那标记位变2

如果需要分配新的区,从标记位开始找即可。假设当前标记位是5,有需要分配4个区,oracle就从5号区开始向下查找。

存疑

事 实 上 , 堆 表 是 无 序 的 , 堆 表 的 特 点 就 是 无 序 、 插 人 快 速 。 oracle 在 插 人 行 时 是 如 何 在 数 据 块 内 查 找 可 用 空 间 的 呢 ? 这 有 点 类 似 于 上 节 中 提 到 的 区 的 分 配 过 程 。 Oracle 会 在 数 据 块 中 设 立 一 个 标 记 位 , 记 录 空 间 使 用 到 哪 儿 了 。 块 中 用 户 数 据 所 占 空 间 是 从 下 往 上 分 配 的 。 假 设 , 在 8192 字 节 的 块 中 插 人 了 5 行 , 每 行 100 字 节 , 也 就 是 说 , 空 间 已 经 使 用 到 了 ( 8192 一 500 ) 7692 字 节 处 , 那 么 , 标 记 位 的 值 就 是 7692 如 果 删 除 了 其 中 一 行 并 提 交 , 标 记 位 的 值 不 会 变 , 还 是 7692 。 再 重 新 插 人 被 删 除 行 , 或 插 人 新 行 , 将 会 从 7692 处 向 上 查 找 可 用 空 间 , 删 除 行 释 放 出 的 空 间 不 会 被 使 用 。 当 标 记 位 的 值 越 来 越 小 , 向 上 到 达 管 理 性 信 息 的 边 界 时 , 标 记 位 会 再 变 为 8 四 2 。


注意:

开启闪回drop,drop了表,区不会被释放,所以标记位不会下降,drop只是改名,并不会真正删除表。


统一区大小(设置区大小,指定extent 1m)

Create tablespace aaa datafile '/mp/abc.dbf' size 50m uniform size 1m;


系统管理区大小

Create tablespace aaa datafile '/mp/abc.dbf' size 50m reuse;


默认创建,不指定区大小,就是系统管理区大小。reuse是如果有相同名字,直接覆盖。


表大小,小于1m时,每个区64k,当表超过1m时,再分配新区,区大小将是1M。表再进一步变大,区大小会变8M。

由此可见,区大小随表的增大而增大。


统一区大小和系统管理区大小的选择

建议大多数情况,采用系统管理区大小(自动)。

如果某个表,明确知道他会变很大,建议直接建个统一区大小且区比较大的表空间。


和大文件(bigfile)不一样,这里是改区大小,大文件是块大小8k改32k这种。


大点的区建议8m


段中块的使用

(这个值得看看)

所有对象都有id,表和段都有id。

Dba_objects中,object_id是表的id,data_object_id是段的id。


比如建了个表,表的段id和表id是一样的初始。

表id建好不会变,但是段id会变,比如truncate表后,原本的段被删除,再为表建个新的段。也就是将表原本的

存储空间释放,重新分配新的区(extent)。这个过程完毕,表就换了个段。


dba_objects里,object_id是对象id(表id) data_object_id是段id

select object_id,data_object_id from dba_objects where owner='DEF' and object_name='F';


删除某一行,然后回滚,块号、行号还是一样,说明删除某行只是在行上加了删除标志,声明该行空间可被覆盖。

如果提交了后再插入,行的位置肯定发生变化。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69980685/viewspace-3004313/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE、sql server、oceanbase数据库专家,拥有7年以上的大型数据库运维经验,主方向oracle,擅长故障排除、诊断,大体量(TB)迁移,异常故障修复等。拥有丰富主导大型项目经验。服务行业包括:运营商、银行、金融业、政府单位、医疗、制造业、高校等等。

注册时间:2020-07-31

  • 博文量
    116
  • 访问量
    88794