Oracle查看临时表空间的空间使用情况

DBA_TEMP_FREE_SPACE 字典视图包含有关每个临时表空间的空间使用情况的信息。
该信息包括分配的空间和空闲空间。
我们可以使用以下命令在此视图中查询这些统计信息。

SQL> SELECT * from DBA_TEMP_FREE_SPACE;

TABLESPACE_NAME                     TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
----------------------------------- --------------- --------------- ---------
TEMP                                      250609664       250609664  249561088

Oracle创建临时表空间

我们创建临时表空间的方式与创建永久表空间的方式相同,不同之处在于我们在 CREATE TABLESPACE 语句中指定 TEMPORARY 子句并用 TEMPFILE 子句替换 DATAFILE 子句。
下面是一个例子:

示例 1:

SQL> CREATE TEMPORARY TABLESPACE temp2
TEMPFILE 'temp01.dbf' SIZE 50M
AUTOEXTEND ON;
Tablespace created.

示例 2:

SQL> CREATE TEMPORARY TABLESPACE temp3
TEMPFILE 'temp02.dbf' SIZE 50M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 16M;
Tablespace created.

在示例 1 中,第二行中的 SIZE 子句将数据文件的大小以及临时表空间的大小指定为 50MB。
在语句中,AUTOEXTEND ON 子句会自动扩展临时文件的大小,从而扩展临时表空间的大小。
默认情况下,所有临时表空间都使用统一大小的范围创建,每个范围的大小为 1MB。

在示例 2 中,EXTENT MANAGEMENT 子句是可选的。
UNIFORM SIZE 子句指定 16MB 的自定义范围大小,而不是 1MB 的默认范围大小。

为每个数据库创建一个临时表空间(通常命名为 Temp)是很常见的,但是如果数据库需要它们来支持繁重的排序操作,我们可以拥有多个临时表空间,它们是临时表空间组的一部分。
为了删除默认临时表空间,我们必须首先使用 ALTER TABLESPACE 命令为数据库创建一个新的默认表空间。
然后,我们可以像删除任何其他表空间一样删除以前的默认临时表空间。

Oracle 临时表空间

临时表空间包含仅在用户会话期间持续存在的数据。
Oracle 使用临时表空间作为任务的工作区,例如用户的排序操作和索引创建期间的排序。
Oracle 不允许用户在临时表空间中创建对象。
根据定义,临时表空间仅在用户会话期间保存数据,并且所有用户都可以共享数据。

临时表空间确实像其他表空间一样永久存在,例如 System 和 Sysaux 表空间。
但是,临时表空间中的数据具有临时性质,仅在用户会话期间持续存在。
Oracle 使用临时表空间作为任务的工作区,例如用户的排序操作和索引创建期间的排序。
Oracle 不允许用户在临时表空间中创建对象。
根据定义,临时表空间仅在用户会话期间保存数据,并且所有用户都可以共享数据。
当应用程序使用需要在临时表空间中存储临时数据的排序和散列密集型查询时,临时表空间的性能非常关键。

启动实例后,使用临时表空间的第一条语句创建一个排序段,该段由实例中的所有排序操作共享。
当我们关闭数据库时,数据库会释放此排序段。
我们可以查询 V$SORT_SEGMENT 视图以查看为此排序段的空间分配和解除分配。
我们可以通过查询 V$SORT_USAGE 视图来查看当前谁在使用排序段。
使用 V$TEMPFILE 和 DBA_TEMP_FILES 视图查找有关当前分配给临时表空间的临时文件的详细信息。

更多: zhilu jiaocheng

Oracle默认的临时表空间

创建数据库用户时,必须分配一个默认的临时表空间,他们可以其中执行临时工作,例如排序。
如果我们忽略显式分配临时表空间,用户将使用关键的 System 表空间作为他们的临时表空间,这可能导致该表空间的碎片化,除了填满它并冻结数据库活动之外。
在使用 DEFAULT TEMPORARY TABLESPACE 子句创建数据库时,我们可以通过为数据库创建默认临时表空间来避免这些不良情况。
然后,Oracle 将把它用作所有我们没有明确分配临时表空间的用户的临时表空间。

请注意,如果我们在创建数据库时没有创建默认临时表空间,那么稍后再创建也不算晚。
我们可以创建一个临时表空间,如前面的示例所示,并使用如下语句将其设为数据库的默认临时表空间。
但是,请注意此默认临时表空间仅用于新用户。
对于现有用户,我们必须更改用户以更改其临时表空间。

SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temptbs02;

我们可以通过执行以下查询找出数据库当前默认临时表空间的名称:

SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE
FROM database_properties
WHERE property_name='DEFAULT_TEMP_TABLESPACE';
PROPERTY_NAME            PROPERTY_VALUE
-----------------------  ----------------
DEFAULT_TEMP_TABLESPACE  TEMP

Oracle缩小临时表空间

我们可能需要增加临时表空间的大小,以适应使用临时表空间的异常大的作业。
作业完成后,我们可以使用 ALTER TABLESPACE 语句中的 SHRINK SPACE 子句缩小临时表空间。
下面是一个例子:

SQL> ALTER TABLESPACE temp SHRINK SPACE;
Tablespace altered.

SHRINK SPACE 子句将所有临时文件缩小到最小大小,大约为 1MB。
我们可以使用 KEEP 子句来指定临时文件的最小大小,如下所示:

SQL> ALTER tablespace temp SHRINK SPACE KEEP 250m;

Oracle 在压缩临时表空间中的临时文件时使用了一种特殊的逻辑。
假设我们有一个包含两个 1GB 临时文件的临时表空间。
我们执行命令将表空间缩小到 1GB,如下所示:

SQL> ALTER TABLESPACE temp SHRINK SPACE KEEP 1000M;
Tablespace altered.

如果我们查询 V$TEMPFILE 视图,我们将看到:

SQL> SELECT file#, name, bytes/1024/1024 mb FROM v$tempfile;
FILE#  NAME                   MB
-----  --------------------- --------
1      [PATH]/temp01.dbf     999.9375
2      [PATH]/emp02.dbf'      1.0625

数据库将两个临时文件中的一个一直缩小到 1MB,而另一个仅缩小 1MB,从而在该临时文件中保留了 999MB 的空间。
如果目标是将特定临时文件缩小到某个最小值,则可以通过指定要缩小的特定临时文件的名称来实现,如下所示:

SQL> ALTER TABLESPACE temp SHRINK TEMPFILE tempfile '<PATH>/temp02.dbf' KEEP 100m;
Tablespace altered.

此处显示的 ALTER TABLESPACE 语句仅根据我们使用 KEEP 子句指定的数量缩小我们列出的临时文件。
它将其他临时文件单独留在 TEMP 表空间中。
前面语句中的 KEEP 子句确保指定的临时文件保留 100MB 的空间。

以下示例显示了如何在没有任何特定保留空间的情况下缩小单个临时文件:

SQL> ALTER TABLESPACE temp SHRINK tempfile '<PATH>/temp03.dbf';

由于在前面的语句中没有指定 KEEP 子句,因此数据库会将临时文件缩小到可能的最小大小,大约为 1MB。

使用多租户(Multitenant)的 Oracle 12c 数据库需要注意的事项

整个CDB级别有一个默认的临时表空间,我们可以在CDB级别创建多个临时表空间,与传统数据库一样,CDB级别的默认临时表空间只能是一个。
可以在 PDB 级别为用户显式分配一些临时表空间。

在 PDB 级别,我们也可以拥有与传统结构相同的结构,具有多个临时表空间和一个默认临时表空间。
可以在 PDB 级别为用户显式分配一些临时表空间。

如果用户在 CDB 和 PDB 级别明确分配了临时表空间,则分配给它的临时表空间取决于它当前所在的容器(PDB 或者 CDB)。

如果用户存在于 PDB 中但未明确分配任何临时表空间,并且 PDB 也没有任何默认临时表空间,则 CDB 级别的默认临时表空间将分配给该用户(在传统的表空间中,我们有分配的系统表空间)。

Oracle临时表空间中的临时段处理

在 RDBMS 7.3 版中,Oracle 引入了临时表空间的概念。
该表空间将用于保存临时对象,如排序段。
出于性能原因,定义为临时表空间的管理已更改,因此分配的段和范围不会被释放并放置在空闲列表中,而只会被标记为空闲。

例如,当排序发生时,Oracle 会分配进行排序所需的尽可能多的区。
在排序结束时,盘区被标记为空闲,但它们不会被释放。
单排序段方法避免了不必要的空间管理:

  • 单个排序段由给定实例的多个排序操作分配和共享。
  • 来自这个新排序段的空间分配和释放不需要标准 ST 入队。
  • 实例上的第一个排序操作创建排序段。后续排序操作可能会通过添加新范围或者从该段中分配现有范围来增加排序段。
  • 排序段最终增长到一个稳定状态,没有分配区

排序操作后不会释放存储空间,而只会更改排序段中范围的状态。
作为其中的一部分,创建了一个新的数据结构。
它称为Sort Extent Pool,在SGA 中从Shared Pool 分配。
此结构包含对所有活动排序段及其在排序段中的范围的描述。
需要访问排序段的进程由称为排序范围池锁存器的本地锁存器同步。
Sort Extent Pool 锁存器可以在 V$LATCH 和 V$LATCHNAME 视图中找到。

如前所述,有一个新的表空间类型称为 TEMPORARY。
默认情况下,所有表空间都创建为 PERMANENT。
永久表空间可以保存所有类型的对象,包括临时段。
在 PERMANENT 表空间中创建的临时段仍然遵循旧算法,并在使用后由 SMON 清理/删除。
临时表空间只能容纳排序段,不允许在表空间中创建其他对象。
有两种方法可以将表空间标识为 TEMPORARY:

  1. 使用 CREATE TABLESPACE...TEMPORARY 命令。

  2. 使用 ALTER TABLESPACE...TEMPORARY 。

Oracle更改临时表空间

我们可以发出 ALTER TEMPORARY TABLESPACE 语句来执行各种临时表空间管理任务,包括添加临时文件以增加临时表空间。
下面是一个示例,显示如何使临时表空间更大:

SQL> ALTER TABLESPACE temp ADD TEMPFILE '<PATH>/tempo3.dbf' size 1000M reuse;

我们可以类似地使用以下 ALTER TABLESPACE 命令来调整临时文件的大小:

SQL> ALTER DATABASE TEMPFILE '<PATH>/temp03.dbf RESIZE 200M;

我们可以使用以下语句删除临时文件并删除操作系统文件:

SQL> ALTER DATABASE TEMPFILE '<PATH>/temp03.dbf' DROP INCLUDING DATAFILES;

当我们删除属于临时表空间的临时文件时,表空间本身将继续使用。

日期:2020-09-17 00:11:32 来源:oir作者:oir