数据块管理
数据块(Data Block)的管理有两种主要方式:自动段空间管理(Automatic Segment Space Management, ASSM) 和 手动管理(Manual Management)。这两种方法在如何分配和管理表空间中的数据块使用上有所不同,每种方法有其优缺点,适用于不同的场景。
1. 自动段空间管理(ASSM)
自动段空间管理 是 Oracle 引入的一种自动化管理机制,它通过 位图 来管理数据块中的空闲空间,自动处理空闲空间的分配、释放和合并,减少了手动干预的需求。
特点:
- 位图(Bitmap)管理:ASSM 使用位图来跟踪段中每个数据块的空闲空间。每个数据块的空闲和已用状态都由位图中的一位来表示(0 代表空闲,1 代表已用)。
- 自动合并空闲空间:ASSM 可以自动合并分散的空闲空间,避免空间碎片化的发生,确保数据块空间的高效使用。
- 减少锁争用:由于 ASSM 使用位图来跟踪空闲空间,因此它能减少多个会话同时访问同一数据块时的锁争用,提升并发性能。
- 对于本地管理的表空间,智能在表空间级别启用自动段空间管理。
优势:
- 自动化管理:ASSM 完全自动处理空间的分配和回收,减少了 DBA 的工作负担,尤其在高并发环境下非常有用。
- 减少碎片化:通过合并空闲空间,ASSM 能够有效地减少碎片化,提高空间利用率。
- 提高性能:由于较少的手动干预和减少锁竞争,ASSM 通常能够提供更好的并发性能。
适用场景:
- 默认方式:在 Oracle 9i 及更高版本中,默认使用 ASSM 管理表空间。
- 表空间使用频繁更新和插入的场景:例如,业务交易系统,数据表更新频繁,适合使用 ASSM 来减少空间碎片和提升性能。
2. 手动管理(Manual Management)
在 手动管理 模式下,DBA 必须显式地控制数据块的空间分配和回收。这种方式通常依赖于一些表空间和段空间管理参数,如 PCTFREE
、PCTUSED
、INITRANS
和 MAXTRANS
,以及 FREELISTS
来手动管理空间。
CREATE TABLESPACE data02
DATAFILE ‘/u01/oradata/data02.dbf’ SIZE 5M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K
SEGMENT SPACE MANAGEMENT AUTO;
特点:
- 自由空间管理:手动管理依赖于由 DBA 设置的参数来控制块中的空闲空间。例如,
PCTFREE
指定了数据块中保留的最小空间百分比,PCTUSED
指定了数据块中使用空间的最低百分比。 - 使用自由列表(Freelists):DBA 需要通过配置
FREELISTS
来决定有多少个列表用于管理空闲数据块,多个列表可以减少并发插入时的锁争用。 - 空间合并:空间的合并通常需要 DBA 的干预,尤其是当数据块内空闲空间碎片化严重时,可能需要执行手动的
ALTER TABLE
或ALTER INDEX
操作来回收空间。
优势:
- 更多控制:DBA 可以精确地控制表空间中数据块的分配、回收、空闲空间的使用等,可以根据具体的业务需求做出优化。
- 适合老旧系统或特定需求:对于老旧系统,或是需要精细调控空间分配的特殊应用场景,手动管理可以提供更多的灵活性。
缺点:
- 维护负担重:DBA 需要定期监控和调整
PCTFREE
、PCTUSED
、FREELISTS
等参数,确保空间得到合理利用。这对于高并发、大量插入和删除的系统可能是一个管理负担。 - 易碎片化:在没有适当维护的情况下,手动管理可能导致数据块中的空闲空间变得碎片化,影响空间的利用效率。
适用场景:
- 老旧系统或特殊需求的系统:一些早期的 Oracle 版本或需要特别调优的应用系统可能使用手动管理。
- 低更新频率的表:对于更新频率较低的静态数据表,手动管理可能是一个合适的选择,因为这些表的空间需求变化较小。
3. ASSM vs Manual Management
特性 | 自动段空间管理(ASSM) | 手动管理 |
---|---|---|
空间管理方式 | 位图管理,自动处理空间的分配和回收 | DBA 手动设置 PCTFREE 、PCTUSED 等参数 |
合并空闲空间 | 自动合并空闲空间 | 需要 DBA 手动处理碎片化或回收空间 |
并发性能 | 较高的并发性能,减少锁竞争 | 并发性能可能受到锁竞争和碎片化的影响 |
管理难度 | 管理简单,自动化 | 管理负担较重,需 DBA 定期干预 |
适用场景 | 高并发系统、更新频繁的系统,默认选项 | 需要精细控制、老旧系统或特定调优的场景 |
空间利用率 | 通常较高,自动减少碎片化 | 可能受到碎片化影响,需要定期优化空间使用 |
4. 自动段空间管理(ASSM)详细工作原理
- 位图管理:每个数据块都有一个位图记录块内的空闲和已用空间,Oracle 可以通过这个位图快速找到可用空间并分配。
- 空闲空间回收:在执行 DML(数据操作语言)语句时,如插入、更新或删除数据时,ASSM 会自动处理数据块内的空间回收,减少碎片化。
- 合并空闲空间:当空闲空间变得零散时,Oracle 会自动进行合并,以提高空间的利用率。
5. 总结
-
自动段空间管理(ASSM) 适用于大多数现代应用,尤其是高并发、频繁更新的环境。它提供了自动化的空间管理,减少了 DBA 的管理工作量,并能有效提升性能。
-
手动管理 仍然适用于某些特定场景,比如老旧系统或者需要精细控制的环境。它提供了更多的灵活性,但也增加了管理复杂性和维护负担。
对于大多数新建的 Oracle 数据库系统,通常建议使用 自动段空间管理(ASSM),而 手动管理 多用于需要细致调优或有特殊需求的系统。
- 高PCTFREE,低PCTUSED:适用于频繁更新且行大小可能增加的情况。这样可以在插入时保留更多空间,以便后续更新时使用,避免频繁的块分裂。
- 低PCTFREE,高PCTUSED:适用于主要进行插入和删除操作的情况,或者更新操作通常会缩小行大小。这种设置可以更有效地利用块空间,减少空闲空间的浪费。
在设置了PCTFREE=20和PCTUSED=40的情况下:
- 当数据块中的剩余空间等于或少于20%时,可以继续向块中插入行数据。当行数据占据可用数据空间的80%(100-PCTFREE)或更多时,该块将不再可用于插入操作。
- 剩余的20%空间可用于处理行大小的增加,例如,原本为空的列被更新为具有值。因此,由于更新操作,块的利用率可能超过80%。
- 如果在块中删除行或由于更新操作导致行大小减小,块的利用率可能会降低到80%以下。然而,直到利用率降至PCTUSED以下(在此示例中为40%),该块才能用于插入操作。
- 当利用率降至PCTUSED以下时,该块可用于插入操作。随着行数据的插入,块的利用率会增加,然后重复上述步骤。
Oracle 数据库存储管理
在 Oracle 数据库中,存储的相关信息可以通过查询以下视图来获取:
- DBA_EXTENTS(段信息视图)
- DBA_SEGMENTS(段视图)
- DBA_TABLESPACES(表空间视图)
- DBA_DATA_FILES(数据文件视图)
- DBA_FREE_SPACE(自由空间视图)
1. DBA_EXTENTS(段信息视图)
功能:DBA_EXTENTS
视图提供了关于表空间中各个段的扩展(Extent)信息。每个段是由多个扩展组成的,而扩展是表空间中存储数据的最小单位。
关键字段:
SEGMENT_NAME
:段的名称(通常是表、索引等对象的名称)。SEGMENT_TYPE
:段的类型,如TABLE
(表)、INDEX
(索引)、LOB
(大对象)等。TABLESPACE_NAME
:该段所在的表空间名称。EXTENT_ID
:扩展的唯一标识符。BLOCK_ID
:扩展的起始数据块号。BYTES
:扩展的大小,以字节为单位。FILE_ID
:存储该扩展的文件 ID。
使用场景:
- 通过查询
DBA_EXTENTS
,你可以了解数据库中各个段的存储分布情况。例如,某个表或索引的存储是否发生了碎片化,或者它们的存储空间是否连续。 - 你还可以使用它来判断数据库对象(如表、索引)是否过度分散在多个数据文件或表空间中。
2. DBA_SEGMENTS(段视图)
功能:DBA_SEGMENTS
视图提供了数据库中所有段的详细信息,包括它们使用的存储空间总量。
关键字段:
SEGMENT_NAME
:段的名称。SEGMENT_TYPE
:段的类型,如TABLE
(表)、INDEX
(索引)。TABLESPACE_NAME
:该段所在的表空间。BYTES
:段占用的空间大小(字节数)。BLOCKS
:段占用的块数。OWNER
:该段所属的模式(schema)名称。
使用场景:
- 该视图用于查看所有数据库段的存储情况,包括表、索引和其他数据库对象。你可以快速了解哪些段占用了大量存储空间。
- 该视图也可以用来优化存储分配,尤其是在处理大数据表或频繁查询的索引时。
3. DBA_TABLESPACES(表空间视图)
功能:DBA_TABLESPACES
视图提供了有关数据库中所有表空间的详细信息。表空间是逻辑存储单位,数据库对象(如表、索引等)会被存储在特定的表空间中。
关键字段:
TABLESPACE_NAME
:表空间的名称。STATUS
:表空间的状态,如ONLINE
(在线)、OFFLINE
(离线)、READ ONLY
(只读)。CONTENT
:表空间的内容类型,如PERMANENT
(永久存储),表示表空间用于存储数据;TEMPORARY
(临时),用于临时表空间。SEGMENT_SPACE_MANAGEMENT
:表空间的空间管理方式,如AUTO
(自动空间管理)或MANUAL
(手动管理)。
使用场景:
- 通过查询该视图,你可以查看数据库中所有表空间的状态、类型、以及空间管理方式。
- 如果你需要对表空间进行调整(如扩展表空间,或检查表空间是否为只读等),该视图非常有用。
4. DBA_DATA_FILES(数据文件视图)
功能:DBA_DATA_FILES
视图提供了数据库数据文件的详细信息,数据文件是表空间的物理存储单位。
关键字段:
FILE_NAME
:数据文件的路径和名称。FILE_ID
:数据文件的唯一 ID。TABLESPACE_NAME
:数据文件所属的表空间名称。BYTES
:数据文件的大小(字节数)。AUTOEXTENSIBLE
:是否设置为自动扩展(YES
或NO
)。MAXBYTES
:数据文件的最大大小,如果设置了AUTOEXTENSIBLE
,则表示该文件可以扩展的最大容量。
使用场景:
- 通过查询该视图,你可以查看每个数据文件的大小和扩展状态。如果数据文件已满,且未设置自动扩展,你就可以采取措施(如添加新的数据文件或启用自动扩展)。
- 该视图还可以帮助你在数据库的表空间管理中合理分配和监控存储资源。
5. DBA_FREE_SPACE(自由空间视图)
功能:DBA_FREE_SPACE
视图提供了表空间中所有数据文件中的可用自由空间的信息。
关键字段:
TABLESPACE_NAME
:表空间的名称。FILE_ID
:数据文件的 ID。BLOCK_ID
:自由空间的起始数据块号。BYTES
:自由空间的大小(字节数)。
使用场景:
- 你可以通过查询该视图,了解数据库中表空间的空闲空间情况。若表空间的空间即将耗尽,你可以根据空闲空间的大小决定是否需要扩展表空间或增加数据文件。
- 该视图可以帮助你进行空间管理,避免表空间因空间不足而导致的性能问题。
扩展:如何有效管理 Oracle 数据库存储
在实际使用中,数据库存储管理是一个重要的任务。通过对上述视图的查询和分析,数据库管理员可以:
-
监控空间使用情况:
- 通过定期查询
DBA_SEGMENTS
和DBA_FREE_SPACE
,可以评估数据库的存储使用情况,确保没有浪费空间,或者没有空间不足的风险。 - 对于经常变动的数据,特别是大表和高并发操作的表,管理员需要定期检查存储使用情况,防止因空间不足导致的查询性能下降或数据库停运。
- 通过定期查询
-
合理分配表空间:
- 可以通过合理的表空间分配,优化 I/O 性能。例如,可以将表和索引分配到不同的表空间,以减少表和索引竞争存储资源的问题。
-
空间扩展和自动扩展的管理:
- 数据文件的自动扩展功能非常有用,尤其是在高负载环境下,可以避免因为人为疏忽导致的空间不足问题。然而,管理员仍然需要定期检查数据文件的大小和自动扩展设置,确保它们不会无限制地增长。
-
优化存储使用:
- 通过监控
DBA_EXTENTS
和DBA_SEGMENTS
,可以查看某些对象是否存在碎片化现象。对于极其分散的对象,可以考虑进行重新组织(例如,使用ALTER TABLE
语句进行重建)以提高性能和空间利用率。
- 通过监控
示例查询
查询某个表空间的总使用空间
SELECT
TABLESPACE_NAME,
SUM(BYTES) / 1024 / 1024 AS MB_USED
FROM
DBA_SEGMENTS
GROUP BY
TABLESPACE_NAME;
查询所有数据文件的大小及自动扩展状态
SELECT
FILE_NAME,
BYTES / 1024 / 1024 AS MB_SIZE,
AUTOEXTENSIBLE
FROM
DBA_DATA_FILES;
查询特定表空间中的空闲空间
SELECT
TABLESPACE_NAME,
SUM(BYTES) / 1024 / 1024 AS MB_FREE
FROM
DBA_FREE_SPACE
WHERE
TABLESPACE_NAME = 'USERS'
GROUP BY
TABLESPACE_NAME;
表空间、数据文件、段、扩展
下面介绍了 Oracle 数据库中表空间(tablespace)、数据文件(data file)、段(segment)、扩展(extent)以及空闲和已使用空间(free and used space)之间的关系。通过查询数据字典视图,可以清楚地了解这些存储对象如何相互关联以及如何管理存储空间。下面我会详细解释这些概念的关系,并说明如何通过数据字典视图查看和管理这些存储信息。
表空间、数据文件、段和扩展的关系
在 Oracle 数据库中,存储是由多个层次组成的,包括表空间、数据文件、段、扩展等。每个层次都与其他层次紧密关联,存储空间的使用、分配和释放都在这些层次之间传递和调整。
-
表空间 (Tablespace):
- 表空间是 Oracle 数据库的逻辑存储单位。它为数据库对象(如表、索引等)提供存储位置。每个表空间由一个或多个数据文件组成。
- 当创建表空间时,系统会在
DBA_TABLESPACES
视图中记录一行数据,描述该表空间的名称、状态、存储管理方式等信息。
-
数据文件 (Data File):
- 数据文件是物理存储单位,实际存储数据库对象的数据。每个数据文件属于一个表空间。
- 在数据库中创建数据文件时,Oracle 会在
DBA_DATA_FILES
视图中为每个文件记录一行信息,包含文件的名称、大小、所属表空间等。
-
扩展 (Extent):
- 扩展是表空间中存储数据的最小单位。一个表空间的数据文件被划分为多个块(block),而扩展就是连续的一组块。每当数据库需要存储更多的数据时,会分配一个新的扩展。
- 当一个段(如表或索引)被创建时,Oracle 会为它分配空间,这些空间会以扩展的形式进行分配,并且每个扩展的分配都会在
DBA_EXTENTS
视图中有所记录。
-
段 (Segment):
- 段是存储数据库对象(如表、索引等)的物理存储单位。一个段由一个或多个扩展组成。比如,表的段可能由多个扩展组成,而这些扩展的空间会记录在
DBA_EXTENTS
视图中。 - 每当一个段(例如,表、索引等)被创建时,系统会在
DBA_SEGMENTS
视图中记录一行信息,描述该段的名称、类型、所属表空间以及已分配的空间大小等。
- 段是存储数据库对象(如表、索引等)的物理存储单位。一个段由一个或多个扩展组成。比如,表的段可能由多个扩展组成,而这些扩展的空间会记录在
-
自由空间 (Free Space):
- 空间的分配是动态的,当数据库中的数据文件中有未使用的空间时,这些空间会被记录在
DBA_FREE_SPACE
视图中。空闲空间表示数据文件中尚未分配给任何段的空间。
- 空间的分配是动态的,当数据库中的数据文件中有未使用的空间时,这些空间会被记录在
存储空间分配和管理的过程
-
创建表空间时:
- 当你创建一个表空间并为其分配一个或多个数据文件时,Oracle 会在
DBA_TABLESPACES
中记录该表空间的信息。在数据文件层面,每个数据文件会有一个对应的记录,存储在DBA_DATA_FILES
视图中。 - 在数据文件创建时,这些文件的空间会被认为是空闲的,因此在
DBA_FREE_SPACE
视图中会显示一行记录,表明该文件有一块空闲空间。
- 当你创建一个表空间并为其分配一个或多个数据文件时,Oracle 会在
-
创建段时:
- 当你创建一个段(例如,创建表或索引),Oracle 会为其分配存储空间,这些空间被划分为一个或多个扩展。
- 每当分配一个扩展时,会在
DBA_EXTENTS
视图中记录一行,表示该扩展的起始块和大小。此时,DBA_FREE_SPACE
会根据分配的扩展更新,减少相应的数据文件中的空闲空间。 DBA_SEGMENTS
会记录段的名称、类型(例如TABLE
或INDEX
)、表空间等信息。
-
空间分配后的管理:
- 在文件(数据文件)中,所有的空间(不包括文件头部的块)必须被分配给某些对象,要么在
DBA_EXTENTS
中被列出,要么在DBA_FREE_SPACE
中标记为空闲空间。通过这两个视图的配合,管理员可以完全掌控数据库存储的空间分配和空闲空间的情况。
- 在文件(数据文件)中,所有的空间(不包括文件头部的块)必须被分配给某些对象,要么在
-
空闲空间的管理:
DBA_FREE_SPACE
视图显示了各个数据文件中剩余的空闲空间。这个视图中的空闲空间记录随着扩展的分配和释放而变化。- 例如,删除一个段时,该段的扩展会被释放,空闲空间相应地增加。这个过程通过调整
DBA_FREE_SPACE
中记录的空闲空间来反映。
数据字典视图的更新流程
-
DBA_TABLESPACES:
- 当你创建表空间时,会在此视图中增加一行记录,包含表空间的名称、状态等信息。
-
DBA_DATA_FILES:
- 每当你为表空间添加数据文件时,都会在此视图中增加一行记录,包含数据文件的名称、大小、所属表空间等信息。
-
DBA_FREE_SPACE:
- 数据文件的空间(除去文件头)初始时被认为是空闲的,因此它们会在
DBA_FREE_SPACE
中被记录为自由空间。当分配空间给段时,DBA_FREE_SPACE
会减少,反映出已使用空间。
- 数据文件的空间(除去文件头)初始时被认为是空闲的,因此它们会在
-
DBA_SEGMENTS:
- 当段(如表或索引)创建时,会在此视图中增加一行记录,描述段的名称、类型、所属表空间和分配的空间大小等信息。
-
DBA_EXTENTS:
- 每当扩展被分配给段时,会在此视图中记录每个扩展的详细信息,包括起始块、分配的字节数、所属段等。
总结
通过数据字典视图,你可以全面地查看 Oracle 数据库的存储结构,包括表空间、数据文件、段、扩展和空闲空间。以下是每个视图的作用:
- DBA_TABLESPACES:显示所有表空间的信息。
- DBA_DATA_FILES:显示所有数据文件的信息。
- DBA_FREE_SPACE:显示数据文件中的空闲空间。
- DBA_SEGMENTS:显示所有段的信息。
- DBA_EXTENTS:显示段所使用的扩展的信息。
创建表、索引以及使用存储选项来配置表的存储参数
1. 创建 enp
表
CREATE TABLE enp (
empno NUMBER(4),
ename VARCHAR2(30),
job VARCHAR(9),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(2)
)
TABLESPACE data01
STORAGE (INITIAL 100K NEXT 100K PCTINCREASE 8 MAXEXTENTS 10);
-
表定义:创建名为
enp
的表,该表包含以下列:empno
:员工编号,NUMBER(4)
类型,表示最多 4 位数字。ename
:员工姓名,VARCHAR2(30)
类型,最大长度为 30 个字符。job
:员工职位,VARCHAR(9)
类型,最大长度为 9 个字符。mgr
:员工的经理编号,NUMBER(4)
类型。hiredate
:员工的入职日期,DATE
类型。sal
:员工薪水,NUMBER(7,2)
类型,最大 7 位数字,包含 2 位小数。comm
:员工的奖金,NUMBER(7,2)
类型。deptno
:部门编号,NUMBER(2)
类型。
-
表空间:表被存储在
data01
表空间中。 -
存储选项:
INITIAL 100K
:该表的初始存储空间为 100 KB。NEXT 100K
:每次扩展时,表将增加 100 KB 的空间。PCTINCREASE 8
:每次扩展时,表空间增加的比例是 8%。MAXEXTENTS 10
:表的最大扩展次数为 10。也就是说,表最多可以扩展 10 次,每次扩展NEXT
定义的空间。
2. 创建 fragnent1
表
CREATE TABLE fragnent1 (a NUMBER)
TABLESPACE data01
STORAGE (INITIAL 10K);
- 表定义:创建一个名为
fragnent1
的表,表中包含一列a
,类型为NUMBER
。 - 表空间:该表存储在
data01
表空间。 - 存储选项:表的初始存储空间为 10 KB,未设置
NEXT
或MAXEXTENTS
等其他选项。
3. 创建 dept
表
CREATE TABLE dept (
deptno NUMBER,
dname VARCHAR(15),
loc VARCHAR2(20)
)
TABLESPACE data81
STORAGE (INITIAL 50K NEXT 50K);
-
表定义:创建一个名为
dept
的表,包含以下列:deptno
:部门编号,NUMBER
类型。dname
:部门名称,VARCHAR(15)
类型。loc
:部门位置,VARCHAR2(20)
类型。
-
表空间:该表存储在
data81
表空间。 -
存储选项:
INITIAL 50K
:该表的初始存储空间为 50 KB。NEXT 50K
:每次扩展时,表将增加 50 KB 的空间。
4. 创建 fragnent2
表
CREATE TABLE fragnent2 (a NUMBER)
TABLESPACE data01
STORAGE (INITIAL 8K);
- 表定义:创建一个名为
fragnent2
的表,表中包含一列a
,类型为NUMBER
。 - 表空间:该表存储在
data01
表空间。 - 存储选项:表的初始存储空间为 8 KB。
5. 创建 big_enp
表
CREATE TABLE big_enp (
empno NUMBER(4),
ename VARCHAR2(30)
)
TABLESPACE data01
STORAGE (INITIAL 1M NEXT 1M MAXEXTENTS 10);
-
表定义:创建名为
big_enp
的表,该表包含以下列:empno
:员工编号,NUMBER(4)
类型。ename
:员工姓名,VARCHAR2(30)
类型。
-
表空间:该表存储在
data01
表空间。 -
存储选项:
INITIAL 1M
:表的初始存储空间为 1 MB。NEXT 1M
:每次扩展时,表将增加 1 MB 的空间。MAXEXTENTS 10
:表的最大扩展次数为 10。
6. 创建索引 i_e_enpno
CREATE INDEX i_e_enpno
ON enp(ename)
TABLESPACE indx01
STORAGE (INITIAL 50K NEXT 50K);
- 索引定义:创建一个索引
i_e_enpno
,该索引基于enp
表的ename
列。 - 表空间:该索引存储在
indx01
表空间。 - 存储选项:
INITIAL 50K
:索引的初始存储空间为 50 KB。NEXT 50K
:每次扩展时,索引将增加 50 KB 的空间。
7. 删除 fragnent1
表
DROP TABLE fragnent1;
- 删除操作:删除名为
fragnent1
的表。
8. 删除 fragnent2
表
DROP TABLE fragnent2;
- 删除操作:删除名为
fragnent2
的表。
解释总结
-
创建表和索引:上述脚本创建了多个表 (
enp
,fragnent1
,dept
,fragnent2
,big_enp
) 和一个索引 (i_e_enpno
),并为它们分别指定了存储选项,如初始空间大小 (INITIAL
)、扩展空间大小 (NEXT
)、最大扩展次数 (MAXEXTENTS
) 等。 -
表空间:每个表和索引都被存储在特定的表空间中(如
data01
,data81
,indx01
)。表空间决定了数据存储的位置。 -
存储选项:
INITIAL
:指定表或索引的初始空间大小。NEXT
:指定每次扩展时增加的空间大小。MAXEXTENTS
:限制表或索引的最大扩展次数。PCTINCREASE
:指定每次扩展时空间增加的百分比。
-
删除表:脚本的最后两行分别删除了
fragnent1
和fragnent2
表。
获取每个表空间的碎片数量和总字节数,以及最大的空闲空间:
SELECT
tablespace_name,
COUNT(*) AS fragments,
SUM(bytes) AS total,
MAX(bytes) AS largest
FROM
dba_free_space
GROUP BY
tablespace_name;
这个查询将返回每个表空间的名称、碎片数量、总字节数和最大的空闲空间。碎片数量指的是表空间中的碎片块数量,即由于数据的插入、删除或更新操作而导致的空闲空间分散在表空间中的块数量。这些碎片块可能无法被有效利用,会导致表空间的空间利用率下降,影响数据库性能。
查找在表空间中下一个扩展大小超过该表空间中最大空闲空间的段(segment)。具体解释如下:
SELECT s.segment_name, s.segment_type, s.tablespace_name, s.next_extent FROM dba_segments s WHERE NOT EXISTS ( SELECT 1 FROM dba_free_space f WHERE s.tablespace_name = f.tablespace_name HAVING MAX(f.bytes) > s.next_extent );
SELECT s.segment_name, s.segment_type, s.tablespace_name, s.next_extent FROM dba_segments s
: 选择段(segment)的名称、类型、所在表空间和下一个扩展大小。
WHERE NOT EXISTS (SELECT 1 FROM dba_free_space f WHERE s.tablespace_name = f.tablespace_name HAVING MAX(f.bytes) > s.next_extent)
: 使用子查询来筛选出满足条件的段,即在表空间中下一个扩展大小超过表空间中最大空闲空间的段。
通过查询数据字典(Data Dictionary),可以查看表空间、数据文件、段(segment)以及空闲和已使用区的关系。以下是对数据字典的查询操作的说明:
- DBA_TABLESPACES:创建一个或多个文件的表空间时,会在DBA_TABLESPACES中添加一行记录。
- DBA_DATA_FILES:每个数据库文件都会在DBA_DATA_FILES中添加一行记录,显示每个数据文件的空间,不包括文件头,显示为一个空闲区在DBA_FREE_SPACE中。
- DBA_SEGMENTS:创建段时,在DBA_SEGMENTS中可见一行记录。段中分配给区的空间可以从DBA_EXTENTS中查看。DBA_FREE_SPACE会调整,显示已为段创建区的文件中的较低空闲空间。
- DBA_EXTENTS:使用DBA_EXTENTS视图检查给定段的区。
- DBA_FREE_SPACE:使用DBA_FREE_SPACE视图检查给定段的区。