Oracle数据库表相关术语

本文详细介绍了Oracle数据库中段的概念,包括表、索引、LOB等段类型,以及段空间的管理方式——手动段空间管理和自动段空间管理。此外,还讨论了高水位线(HWM)的重要性和作用,以及freelist在管理空闲块中的功能。同时,文章解释了PCTFREE和PCTUSED参数如何影响数据存储和更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle数据库表有很多相关的存储参数和术语,今天我们来详细介绍一些。

段是占用磁盘存储空间的一个对象,有多种段的类型:

  • 聚簇:这种短类型能存储表,通常用户存储多个数据库表的相关数据,将其预联结存储到同一个数据库块上。
  • 表:表段保存一个数据库表的数据。
  • 表分区或子分区:这种段类型用于分区
  • 索引:这种段类型可以保存索引结构
  • 索引分区:类似于表分区,包含一个索引的某个片,一般有一个或者多个的索引分区段组成。
  • lob分区(lob partition),lob子分区(lob subpartition),lob索引(lobindex),lob段(lobsegment):lob索引和lob段保存大对象的结构。lob段也会分区,lob分区段正用与此。
  • 嵌套表:这是为嵌套表指定的段。
  • 回滚段:undo数据就存储在此

一个表可以是一个段,索引有可能是一个段,我们也可以将所有分到不同的段中。同样的由于表分区,一个表可以有多个表段。
不过一般来说,表时一个段,索引是一个短
如以下例子:

create table t_a(
x int primary key,
y clob,
z blob
)

我们创建一个表,然后调用如下语句去查询段空间使用情况

select segment_name,segment_type from user_segments;

在这里插入图片描述

在这里插入图片描述
可以看到创建了6个段,其中表本身创建了一个段,主键约束创建了一个索引从而创建了一个段。
另外LOB列分布创建了两个段,一个段用来存储字符大对象(CLOB)或者二进制大对象(BLOB),另一个段用来组织这些数据库。LOB存储在lobsegment块中,lobindex用于跟踪LOB块在哪里,以及应该以何种顺序来访问他们。

段空间管理

管理段空间的方法有两种:

  • 手动段空间管理(MSSM):由你设置FREELISTS、FREELIST GROUPS、PCTUSED和其他参数来控制如何分配,使用和重用段中国的空间
  • 自动段空间管理(ASSM):只需要控制一个相关的参数PCTFREE

高水位线

如果我们把表现象成一个从左到右依次排列的一系列块,高水位线(HWM)就是包含了数据最右的块,可以认为是表数据在一个堆栈中最顶层的地址。在我们对表中的数据进行一些删除的操作之后,高水位线以下的数据就出现了空闲块,这时候高水位线是不会下降的,这些空闲块会一直保存在高水位线以下,知道截除,重建或者收缩这个对象。
HWM和重要,因为Oracle在全表扫描的时候会扫描HWM以下所有的块,所有就算把表中数据全部删除了在执行select count(*)也会消耗和之前没有删除数据的时候一样的时间。
在MSSM表空间中,段只有一个HWM,不过在ASSM中还有一个低HWM,在ASSM的HWM推进的时候不会立刻格式化而是在插入的时候在进行格式化,在插入数据的时候会插入到高低水位线之间的任意块中,因此高低水位线之间许多块不会被格式化,因此在ASSM表进行全表扫描的时候,对于低HWM以下的块会直接读取,而高低水位线之间的块会小心处理。

freelist

freelist 是一种单向链表,oracle用它来管理oracle某个对象中位于高水位线下的空闲块.需要注意一点的是,只有在低与高水位下的块才有可能在freelist中被发现。高水位的块被用到的情况, 只能在当freelist为空的时候,即低水位中无可用的存储块,才发生,这个时候,oracle会提高水位线的位置,并且把相应的块加到 freelist中。
但是也不是freelist越多越好,在有多个freelist的情况下就好有一个主freelist和一些进程freelist。进程freelist中只有少量的块,剩下的都在主freelist中,用完后会找主freelist在分配,如果主freelist也用完了就好提高水平下在获取新的块。
比如你的一个表上有10个进程freelist,如果其中的一个用完了块,那么他是不会找其他9个进程去取空闲的块的,只会向主进程获取,如果主进程也不能满足就会提高水平线,这样就会导致不太必要的时候磁盘空间。

PCTFREE和PCTUSED

PCTFREE参数告诉Oracle应该在块上保留多少空间来完成将来的更新,如果块中空闲的的百分比大于PCTFREE,就认为这个快是空闲的。PCTUSED告诉Oracle当前不空闲的块中的空闲空间百分比大于多少才会变成空闲的。
ASSM和MSSM表空间中两种参数的实际作用会有所不同。在MSSM中会控制这些块何时放入FREELIST中,以及何时从FREELIST中取出,而ASSM中就用来判断一个块能否插入新的数据,因为ASSM中没有FREELIST。
设置PCTFREE和PCTUSERD是很重要的主题:

  • 高PCTFREE,低PCTUSED:如果你插入了将要更新的大量数据的时候,而且这些更新会频繁的加大行的大小就很适合这种设置。这种设置会预留大量的空间,并使得进入FREELIST之前必须基本为空。
  • 低PCTFREE,高PCTUSERD:适合于只想对表进行Insert,或者更新只会缩小行的大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值