Oracle架构之段管理和区管理

文章目录

  • [1 段](#1 段)
    • [1.1 简介](#1.1 简介)
      • [1.1.1 定义](#1.1.1 定义)
      • [1.1.2 分类](#1.1.2 分类)
    • [1.2 段空间的管理模式](#1.2 段空间的管理模式)
      • [1.2.1 手工段空间管理(Manual Segment Space Management)](#1.2.1 手工段空间管理(Manual Segment Space Management))
      • [1.2.2 自动段空间管理(Auto Segment Space Management)](#1.2.2 自动段空间管理(Auto Segment Space Management))
    • [1.3 段空间的手工管理(Manual Segment Space Management)](#1.3 段空间的手工管理(Manual Segment Space Management))
      • [1.3.1 查看空闲列表](#1.3.1 查看空闲列表)
      • [1.3.2 手工指定空闲列表的数量](#1.3.2 手工指定空闲列表的数量)
    • [1.4 段空间自动管理(Auto Segment Space Management)](#1.4 段空间自动管理(Auto Segment Space Management))
      • [1.4.1 查看位图块和段头块](#1.4.1 查看位图块和段头块)
  • [2 区](#2 区)
    • [2.1 简介](#2.1 简介)
      • [2.1.1 定义](#2.1.1 定义)
      • [2.1.2 查看 extent 的信息](#2.1.2 查看 extent 的信息)
    • [2.2 创建 extent](#2.2 创建 extent)
      • [2.2.1 自动创建 extent](#2.2.1 自动创建 extent)
      • [2.2.2 建表时手工指定 extent 大小](#2.2.2 建表时手工指定 extent 大小)
    • [2.3 扩展与回收](#2.3 扩展与回收)
      • [2.3.1 扩展 extent](#2.3.1 扩展 extent)
      • [2.3.2 手工回收 extent](#2.3.2 手工回收 extent)
      • [2.3.3 删除数据后回收 extent](#2.3.3 删除数据后回收 extent)
      • [2.3.4 执行 truncate 和 drop 命令收缩 extent](#2.3.4 执行 truncate 和 drop 命令收缩 extent)
    • [2.4 extent 空间分配算法](#2.4 extent 空间分配算法)

1 段

1.1 简介

1.1.1 定义

段是由一个或多个数据区构成的,它不是存储空间的分配单位,而是一个独立的逻辑存储结构,用于存储表、索引或簇等占用空间的数据对象, Oracle 也把这种占用空间的数据对象统一称为段。

当一个段被创建时,区间(Extent)就被分配,随着后续的不断使用,一个段的空间可以以区为单位不断扩展。
一个段只属于一个特定的数据对象,每当创建一个具有独立段的数据对象时, Oracle 将为它创建一个段。段是为特定的数据对象(如表、索引、回滚等)分配的一系列数据区。

段是逻辑结构中更高层次的组织单位,用于存储和管理数据。一个表或索引在磁盘上对应一个或多个段。

一个段只能存放在一个表空间中,但是可分布在属于这个表空间中的多个数据文件中。段内包含的数据区可以不连续,并且可以跨越多个文件,使用段的目的是用来保存特定对象。

1.1.2 分类

可以使用数据字段 dba_segments 查看 Oracle 段的类型:

sql 复制代码
SQL> select distinct segment_type from dba_segments;

一个 Oracle 数据库通常有以下 几种类型的段:

  • 数据段:也称为表段,数据段中保存的是表中的数据记录。在创建数据表时, Oracle 系统将为表创建数据段。当表中的数据量增大时,数据段的大小自然也随着变大,数据段的增大过程是通过向其添加新的数据区来实现的。当创建一个表时,系统自动创建一个以该表的名字命名的数据段。
sql 复制代码
查询users 表空间中,所有表的名称、大小
SQL> select OWNER, SEGMENT_NAME, BYTES/1024/1024 size_MB
     from dba_segments
     where segment_type='TABLE' and tablespace_name='USERS';
  • 索引段:索引段中包含了用于提高系统性能的索引信息。一旦建立索引,系统自动创建一个以该索引的名字命名的索引段。
sql 复制代码
查询users 表空间中,所有索引的名称、大小:
SQL> select OWNER, SEGMENT_NAME, BYTES/1024/1024 size_MB
     from dba_segments
     where segment_type='INDEX' and tablespace_name='USERS';
  • 回滚段:回滚段(也可称作撤销段)中保存了回滚条目, Oracle 将修改前的旧值保存在回滚条目中。利用这些信息,可以撤销未提交的操作,以便为数据库提供读入一致性和回滚未提交的事务,即用来回滚事务的数据空间。
    当一个事务开始处理时,系统为之分配回滚段,回滚段可以动态创建和撤销。
    回退段包含两种类型:(1)ROLLBAKTY;(2)PE2 UNDO
sql 复制代码
查看回退段的信息:
SQL> select owner,segment_name,tablespace_name from dba_segments where segment_type='ROLLBACK';
SQL> select owner,segment_name,tablespace_name from dba_segments where segment_type='TYPE2 UNDO';

也可通过数据字典 dba_rollback_segs 查看回退段的信息:
SQL> select owner,segment_name,tablespace_name,status from dba_rollback_segs;
	
  • 临时段:当执行创建索引、查询等操作时, Oracle 可能会使用一些临时存储空间,用于暂时性地保存解析过的查询语句以及在排序过程中产生的临时数据。 Oracle 系统将在专门用于存储临时数据的表空间中为操作分配临时段。一旦语句执行完毕,临时段将自动消除。
    在执行"CREATE INDEX"、"SELECT ORDER BY"、"SELECT DISTINCT"和"SELECT GROUPBY"等几种类型的 SQL 语句时, Oracle 系统就会在临时表空间中为这些语句的操作分配一个临时段。
    在数据库管理过程中,若经常需要执行上面这类 SQL 语句,最好调整 SORT_AREA_SIZE 初始化参数来增大排序区,从而使排序操作尽量在内存中完成,以获得更好的执行效率,但同时这对数据库服务器的内存空间提出了更大的要求。
  • LOB 段:如果表中含有 CLOB 和 BLOB 等大型对象类型数据时,系统将创建 LOB 段以存储相应的大型对象数据。

1.2 段空间的管理模式

段空间管理模式,就是怎样管理段内的空闲空间,是指如何管理段所拥有的数据块中的空闲块。段空间管理模式分为两种:自动管理(auto)手工管理(manual)

段空间管理模式是表空间的一个属性。即:某个表空间中的所有段必须采用同一种管理模式。

查看段空间的管理模式:

sql 复制代码
SQL> select tablespace_name, segment_space_management from dba_tablespaces;

1.2.1 手工段空间管理(Manual Segment Space Management)

MSSM 管理方式是 Oracle 最初实现的一种段空间管理技术。区间(Extent)是 Oracle 的最小空间分配单元,而 BlockOracle 的最小 IO 操作单元,也就是说,Oracle 以区间为单位将空间分配给段,而段内则是以 Block 为单位进行空间使用和管理的。

MSSM 管理方式的具体实现方式是通过在段头(Segment Header)分配空闲列表(freelist)来管理 Block 的使用,可以把自由列表想象成一个数据表,Oracle 依赖一系列的算法通过向自由列表中加入或移出 Block 来实现段空间管理。

1.2.2 自动段空间管理(Auto Segment Space Management)

ASSM中,原有的 freelist 被位图所取代,通过位图能够迅速有效地管理存储扩展和剩余区块(free block),因此能够改善段存储管理的本质。

1.3 段空间的手工管理(Manual Segment Space Management)

MSSM 管理方式的具体实现方式是通过在段头(Segment Header)分配空闲列表(freelist)来管理 Block 的使用。使用空闲列表管理段内的空闲块,空闲列表记录在段头,空闲列表指向段内空闲块的地址,空闲列表的数量可以由用户指定。可以把自由列表想象成一个数据表,Oracle 依赖一系列的算法通过向空闲列表中加入或移出 Block 来实现段空间管理。

当创建对象时(如数据表)可以定义 freelist 的数量,对于数据表缺省的 freelist 为1,可以通过 dba_segments 查询得到这些数据:

sql 复制代码
SQL> select owner,segment_name,freelists from dba_segments where owner='SCOTT';

当向一个对象中插入数据时,Oracle 首先在该对象的 freelist 上寻找可用于插入数据的 Block,当一个 Block 用完之后,就会从 freelist 中删除,当这个 Block 上由于数据删除等空间释放后,可以再次回到 freelist 中,而这主要是通过存储参数 PCTFREEPCTUSED 来实现。

假设PCTFREE=20,PCTUSED=40,表明当一个 Block 的空间使用率达到了 80% 时,这个 block 就不再允许被用于新增数据(insert),而保留下来的这 20% 的空间则被预留为行更新(update)所可能需要的空间扩展,此时这个 Block 就从 freelist 中被删除;当这个 Block 中有数据被删除(delete)时,空间不断被释放,当空间使用低于 PCTUSED 参数设置时(此处即为40%),这个数据块才会重新被加入到 freelists 中,加入 freelist 后这个 Block 又可以被插入新的数据。

通过以上的描述可以看出,如果一个段的操作非常频繁,那么很多用户就会同时请求访问 freelist,并对 freelist 进行修改。对于表来说,缺省的 freelist 为1,这就很容易引发竞争,虽然可以通过增加 freelist 的方法缓解这种竞争,但是我们已经看到这种管理方式存在的缺陷。

可以通过 DUMP 的方式来转储数据块的头信息,查看 freelist 的设置。

1.3.1 查看空闲列表

在 system 表空间(手工管理)创建一张表 scott.tx001

sql 复制代码
-- system 表空间采用手工管理段空间
SQL> create table scott.tx001(id int, name varchar(20)) tablespace system;

--在表中插入数据
SQL> insert into scott.tx001 values(1,'Jack');

SQL> commit;

SQL> alter system checkpoint;

查询 tx001 段的段头块

sql 复制代码
--查询哪些块属于 tx001 段
SQL> select file_id, block_id, blocks from dba_extents where segment_name = 'TX001';

--查询 tx001 段的段头块
SQL> select header_file, header_block from dba_segments where segment_name = 'TX001';

将段头块(segment header)的数据转储到用户进程跟踪文件

sql 复制代码
SQL> alter system dump datafile 1 block 95392;

--查看用户进程跟踪文件的位置
SQL> show parameter background

查看用户进程跟踪文件的内容

shell 复制代码
按时间先后显示用户进程跟踪文件
[root@rac1 trace]# ll -tr *ora*
.....
-rw-r----- 1 oracle asmadmin   386 8月  23 12:33 orcl1_ora_2750.trm
-rw-r----- 1 oracle asmadmin  3640 8月  23 12:33 orcl1_ora_2750.trc
-rw-r----- 1 oracle asmadmin   159 8月  23 12:46 orcl1_ora_4274.trm
-rw-r----- 1 oracle asmadmin  3180 8月  23 12:46 orcl1_ora_4274.trc
查看用户进程跟踪文件的内容
[root@rac1 trace]# cat orcl1_ora_4274.trc

*** 2021-08-23 12:46:51.013
Dump of buffer cache at level 4 for tsn=0 rdba=4289696
Block dump from disk:
buffer tsn: 0 rdba: 0x004174a0 (1/95392)
scn: 0x0000.002bb0a4 seq: 0x01 flg: 0x04 tail: 0xb0a41001
#########################################
## DATA SEGMENT HEADER:段头块
frmt: 0x02 chkval: 0xc5e5 type: 0x10=DATA SEGMENT HEADER - UNLIMITED
#########################################
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00007F6954A3FA00 to 0x00007F6954A41A00
7F6954A3FA00 0000A210 004174A0 002BB0A4 04010000  [.....tA...+.....]
......
7F6954A419F0 00000000 00000000 00000000 B0A41001  [................]
  Extent Control Header
  -----------------------------------------------------------------
  Extent Header:: spare1: 0      spare2: 0     extents: 1     blocks: 7     
                  last map  0x00000000 maps: 0      offset: 4128  
############  高水位标记##########################
## 指向段内的第一个空闲块的地址,即:当前段的第一个空闲块的地址为 0x004174a2
## 查询时如果执行全表扫描,则扫描到高水位标记指向的块就结束。并不需要扫描所有的块。
## 因为高水位之后的块肯定是空白块,不需要扫描。
      Highwater::  0x004174a2  ext#: 0      blk#: 1      ext size: 7     
 blocks in seg. hdr's freelists: 1     
 blocks below: 1     
##############################################
  mapblk  0x00000000  offset: 0     
                   Unlocked
     Map Header:: next  0x00000000 extents: 1    obj#: 87834  flag: 0x40000000
  Extent Map
  -----------------------------------------------------------------
   0x004174a1  length: 7     
  
  nfl = 1, nfb = 1 typ = 1 nxf = 0 ccnt = 1
##############################################
## 空闲列表:指向高水位之前的某个空闲块
  SEG LST:: flg: USED   lhd: 0x004174a1 ltl: 0x004174a1 
##############################################
2021-08-23 12:46:51.087256 : kjbmbassert [0x174a0.1]
End dump data blocks tsn: 0 file#: 1 minblk 95392 maxblk 95392

1.3.2 手工指定空闲列表的数量

指定空闲列表的数量为 2

sql 复制代码
SQL> alter table scott.tx001 storage (freelists 2);

重新转储段头块

sql 复制代码
SQL> alter system dump datafile 1 block 95392;

查看用户进程跟踪文件的内容

shell 复制代码
##按时间先后显示用户进程跟踪文件
[root@rac1 trace]# ll -tr *ora*
.....
-rw-r----- 1 oracle asmadmin 43502 8月  23 14:10 orcl1_ora_9867.trc
-rw-r----- 1 oracle asmadmin  2744 8月  23 14:27 orcl1_ora_14686.trm
-rw-r----- 1 oracle asmadmin 38041 8月  23 14:27 orcl1_ora_14686.trc
-rw-r----- 1 oracle asmadmin   568 8月  24 01:46 orcl1_ora_87048.trm
-rw-r----- 1 oracle asmadmin  5924 8月  24 01:46 orcl1_ora_87048.trc

##查看用户进程跟踪文件的内容
[root@rac1 trace]# cat orcl1_ora_87048.trc

*** 2021-08-24 01:46:33.285
Block dump from disk:
buffer tsn: 0 rdba: 0x004174a0 (1/95392)
scn: 0x0000.002c7a26 seq: 0x01 flg: 0x04 tail: 0x7a261001
frmt: 0x02 chkval: 0xc5e1 type: 0x10=DATA SEGMENT HEADER - UNLIMITED
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00007F4429EE2A00 to 0x00007F4429EE4A00
7F4429EE2A00 0000A210 004174A0 002C7A26 04010000  [.....tA.&z,.....]
......
7F4429EE49F0 00000000 00000000 00000000 7A261001  [..............&z]
  Extent Control Header
  -----------------------------------------------------------------
  Extent Header:: spare1: 0      spare2: 0     extents: 1     blocks: 7     
                  last map  0x00000000 maps: 0      offset: 4128  
      Highwater::  0x004174a2  ext#: 0      blk#: 1      ext size: 7     
 blocks in seg. hdr's freelists: 1     
 blocks below: 1     
  mapblk  0x00000000  offset: 0     
                   Unlocked
     Map Header:: next  0x00000000 extents: 1    obj#: 87834  flag: 0x40000000
  Extent Map
  -----------------------------------------------------------------
   0x004174a1  length: 7     
  
  nfl = 2, nfb = 1 typ = 1 nxf = 0 ccnt = 1
#############################################
## 空闲列表:一共 3 个空闲列表
  SEG LST:: flg: USED   lhd: 0x004174a1 ltl: 0x004174a1 
  SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 
  SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 
#############################################
GLOBAL CACHE ELEMENT DUMP (address: 0x77bf3be8):
...

2021-08-24 01:46:33.462741 : kjbmbassert [0x174a0.1]
End dump data blocks tsn: 0 file#: 1 minblk 95392 maxblk 95392

1.4 段空间自动管理(Auto Segment Space Management)

ASSM 管理方式下,原有的 freelist 被位图所取代,通过位图能够迅速有效地管理存储扩展和剩余区块(free block),因此能够改善段存储管理的本质。在 ASSM 管理方式下,insert 通过扫描位图来查找可用的 block,即使 block 的可用空间低于 PCTFREE,也不会从位图中删除,因此 PCTUSED 参数将不再需要;而 PCTFREE 参数,仍然需要它来指示需要保留多少空间给后续的 update 导致的行数据增长使用。至于 freelists 和 freelist groups 参数在 ASSM 中都无效了。

创建一个数据表,设置 pctfree 选项,命令如下:

sql 复制代码
create table EYGLE (  
    ID    NUMBER(8),  
    UNAME CHAR(1000)  
)  
    tablespace ts001
    pctfree 50; 

新的管理机制用位图数组来跟踪或管理每个分配到对象的块,而每个块有多少剩余空间是根据位图的状态来确定的。Oracle 将高水位(HIgh Water Mark)以下的块分成六种状态:full、UNformat、free 0~25%、free 25~50%、、free 50~75%、free 75~100%。块的空间使用情况会记录在位图块,位图块属于具体的段。

段空间自动管理模式下:由 FIRST LEVEL BITMAP BLOCK(一级位图块)管理空闲块。由 SECOND LEVEL BITMAP BLOCK(二级位图块)管理一级位图块。当数据量足够大时,还会出现 THIRD BITMAP BLOCK(三级位图块),由三级位图块管理二级位图块。

使用 ASSM 管理方式之后,显著提高了 DML 并发操作的性能,因为位图数组的不同部分可以被同时使用,这样就消除了寻找剩余空间的串行化。

1.4.1 查看位图块和段头块

sql 复制代码
在 ts001 表空间(自动管理)创建一张表 scott.tx002
select tablespace_name,contents,segment_space_management from dba_tablespaces;

ts001 表空间采用手工管理段空间
SQL> create table scott.tx002(id int, name varchar(20)) tablespace ts001;

在表中插入数据
SQL> insert into scott.tx002 values(1,'Jack');
SQL> commit;

SQL> alter system checkpoint;

查询哪些块属于 tx002 段
SQL> select file_id, block_id, blocks from dba_extents where 
	 
段头块并不是第一个数据块
SQL> select header_file, header_block from dba_segments where segment_name = 'TX002';

将 128~135 共 8 个块的数据转储到用户进程跟踪文件
Alter system dump datafile 6 block min 128 block max 135;

2 区

2.1 简介

2.1.1 定义

数据区(也可称作数据扩展区)是由一组连续的 Oracle 数据块所构成的 Oracle 存储结构,一个或多个数据块组成一个数据区,一个或多个数据区再组成一个段(Segment)。用于保存特定数据类型的数据,区不可跨越多个数据文件。

当用户创建表时,Oracle 为此表的数据段分配一个包含若干数据块的初始区(initial extent)。当一个段中的所有空间被使用完后, Oracle 系统将自动为该段分配一个新的数据区,这也正符合Extent这个单词所具有的"扩展"的含义,说明 数据区是 Oracle 存储分配的最小单位, Oracle 就以数据区为单位进行存储控件的扩展。如果一个盘区不足以容纳一个逻辑块,则会分配多个相邻的盘区。当段中的数据被删除或移动时,相应的盘区会被释放出来供其他对象使用。

使用数据区的目的是用来保存特定数据类型的数据。 数据区是表中数据增长的基本单位, 在 Oracle数据库中,分配存储空间就是以数据区为单位的。一个 Oracle 对象包含至少一个数据区。设置一个表或索引的存储参数包含设置它的数据区大小。

Oracle数据库中,盘区的大小取决于段的大小、空间使用情况以及数据库的配置参数。

​​​​​​​段的定义中包含了区(extent)的存储参数,存储参数适用于各种类型的段。该参数控制 Oracle 如何为段分配可用空间。如:在 CREATE TABLE 语句中使用 STORAGE 子句设定存储参数,决定创建表时为段分配多少初始空间,或限定一个表最多可以包含多少区。如果没有指定存储参数,创建表时使用所在表空间的默认存储参数。

创建一张空表时是否分配 extentdeferred_segment_creation 参数有关:

sql 复制代码
SQL> show parameter deferred
说明:deferred_segment_creation 参数
为 false 时:创建表的时候分配 extent
为 trude 时:创建表的时候不分配空间,执行 insert 操作时分配空间

2.1.2 查看 extent 的信息

sql 复制代码
创建一张表 scott.emp002
SQL> create table scott.emp002 as select * from scott.emp where 1=2;

使用数据字典 dba_extents 查看 extent 的使用情况

查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id 
     from dba_extents where segment_name = 'EMP002';

可以看到,系统并没有为表 scott.emp002 分配空间。原因就是 deferred_segment_creation 参数为 true 时,并不为空表分配存储空间。

向 scott.emp002 表插入数据
SQL> insert into scott.emp002(empno, ename, sal) values(8888,'TOM',2800);
SQL> commit;

重新查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id 
     from dba_extents where segment_name = 'EMP002';

2.2 创建 extent

2.2.1 自动创建 extent

当用户创建表时(创建一张空表时是否分配 extentdeferred_segment_creation 参数有关),Oracle 为此表的数据段分配一个包含若干数据块的初始区(initial extent)。

当一个段的初始区中的数据块已满,并且有新数据插入时,Oracle 自动为这个段分配一个增量区(incremental extent)。

sql 复制代码
为 scott.emp002 表插入数据
SQL> insert into scott.emp002 select * from scott.emp;

SQL> insert into scott.emp002 select * from scott.emp002;

查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id 
     from dba_extents where segment_name = 'EMP002';


为 scott.emp002 表插入数据
SQL> insert into scott.emp002 select * from scott.emp002;
SQL> insert into scott.emp002 select * from scott.emp002;
SQL> commit;

查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id 
     from dba_extents where segment_name = 'EMP002';

-- extent 增加,并且,每个 extent 包含 8 个数据块

为 scott.emp002 表插入数据
SQL> insert into scott.emp002 select * from scott.emp002;
3840 rows created.

SQL> insert into scott.emp002 select * from scott.emp002;
7680 rows created.

SQL> insert into scott.emp002 select * from scott.emp002;
15360 rows created.

SQL> insert into scott.emp002 select * from scott.emp002;
30720 rows created.

SQL> insert into scott.emp002 select * from scott.emp002;
61440 rows created.

SQL> commit;

查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id 
     from dba_extents where segment_name = 'EMP002';

extent 数量继续增加,但后来每个 extent 包含 128 个数据块

2.2.2 建表时手工指定 extent 大小

创建表时可以指定 storage 参数指定段的大小:

sql 复制代码
创建表 scott.emp666,初始大小 10m
SQL> create table scott.emp666 storage(initial 10m) tablespace ts001 
     as select * from scott.emp;

查看 scott.emp002 表对应的 extent 信息
SQL> 
select file_id, block_id, blocks, extent_id 

2.3 扩展与回收

2.3.1 扩展 extent

使用alter table 命令:

sql 复制代码
查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id 
     from dba_extents where segment_name = 'EMP002';

手工扩展表 emp002 的 extent
SQL> alter table scott.emp002 
     allocate extent (size 2048k datafile '+DATA/orcl/datafile/users.259.1070471891');

2.3.2 手工回收 extent

手工回收 extent 只能回收完全没有使用的 extent。使用 alter table 命令:

sql 复制代码
SQL> alter table scott.emp002 deallocate unused;


查看scott.emp002 表对应的 extent 信息:
SQL> select file_id, block_id, blocks, extent_id 
     from dba_extents where segment_name = 'EMP002';

2.3.3 删除数据后回收 extent

注意:删除数据后 extent 并不会自动回收

sql 复制代码
删除 scott.emp002 中的部分数据
SQL> delete from scott.emp002 where rownum < 55000;
SQL> commit;
SQL> select count(*) from scott.emp002;

SQL> delete from scott.emp002 where rownum < 55000;
SQL> commit;


查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id 
     from dba_extents where segment_name = 'EMP002';

打开行移动
SQL> alter table scott.emp002 enable row movement;

收缩表空间
SQL> alter table scott.emp002 shrink space;

查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id 
     from dba_extents where segment_name = 'EMP002';

2.3.4 执行 truncate 和 drop 命令收缩 extent

执行 truncate 清空数据

sql 复制代码
执行 truncate 清空数据
SQL> truncate table scott.emp002;
Table truncated.

查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id 
     from dba_extents where segment_name = 'EMP002';

执行 drop 命令删除表

sql 复制代码
SQL> drop table scott.emp002;

查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id 
     from dba_extents where segment_name = 'EMP002';

2.4 extent 空间分配算法

查看extent 空间分配算法:

sql 复制代码
SQL> select tablespace_name, allocation_type from dba_tablespaces;

system:extent 呈阶梯增长

sql 复制代码
SQL> select file_id, block_id, blocks, extent_id 
     from dba_extents where segment_name = 'EMP002';

uniform:每次分配的 extent 大小相同

sql 复制代码
创建一个 uniform 类型的表空间
SQL> create tablespace ts003 
     datafile '+DATA/orcl/datafile/ts003.dbf' size 50m uniform size 10m;

在表空间 ts003 中创建表 scott.emp888
SQL> create table scott.emp888 tablespace ts003
     as select * from scott.emp;

查看 scott.emp888 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id 
     from dba_extents where segment_name = 'EMP888';
相关推荐
Hello.Reader1 小时前
FFmpeg 深度教程音视频处理的终极工具
ffmpeg·1024程序员节
runing_an_min1 小时前
ffmpeg视频滤镜:添加边框-drawbox
ffmpeg·音视频·边框·drawbox
wang_chao1183 小时前
FFMPEG+Qt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频
qt·ffmpeg·音视频
三日看尽长安花4 小时前
【Redis:原理、架构与应用】
数据库·redis·架构
concisedistinct10 小时前
当我们在微服务中使用API网关时,它是否会成为系统的瓶颈?这种潜在的瓶颈如何评估和解决?如何在微服务架构中保证高效请求流量?|API网关|微服务|异步处理
安全·微服务·架构
runing_an_min10 小时前
ffmpeg视频滤镜:网格-drawgrid
ffmpeg·音视频·网格·drawgrid
爱奇艺技术产品团队11 小时前
爱奇艺大数据多 AZ 统一调度架构
大数据·架构
丶213612 小时前
【云原生】云原生后端详解:架构与实践
后端·云原生·架构
Mephisto.java13 小时前
【力扣 | SQL题 | 每日4题】力扣2004, 1454,1613,1709
hive·sql·mysql·leetcode·oracle·database
MaiOvv13 小时前
软考高级架构 - 7.3 - 软件架构风格 - 超详细讲解+精简总结
架构