创建临时表空间组

将第一个临时表空间分配给表空间组时,会自动创建临时表空间组。
要创建表空间组,只需在 CREATE TABLESPACE 语句中指定 TABLESPACE GROUP 子句,如下所示:

SQL> CREATE TEMPORARY TABLESPACE temp01 TEMPFILE '<PATH>/temp01_01.dbf' SIZE 500M TABLESPACE GROUP tmpgrp1;

前面的 SQL 语句将创建一个新的临时表空间 temp01,以及名为 tmpgrp1 的新表空间组。
Oracle 创建新表空间组是因为在创建新临时表空间时使用了关键子句 TABLESPACE GROUP。
我们还可以通过在 ALTER TABLESPACE 命令中指定相同的 TABLESPACE GROUP 子句来创建临时表空间组,如下所示:

SQL> ALTER TABLESPACE temp02 TABLESPACE GROUP tmpgrp1

前面的语句将导致 Oracle 创建一个名为 tmpgrp1 的新组,因为之前没有具有该名称的临时表空间组。
如果我们为表空间组名称指定一对引号 ("),则我们隐含地告诉 Oracle 不要将该临时表空间分配给表空间组。
这是一个示例:

SQL> CREATE TEMPORARY TABLESPACE temp02 TEMPFILE '<PATH>/temp02_01.dbf' SIZE 500M TABLESPACE GROUP '';

上述语句创建了一个名为 temp02 的临时表空间,它是一个普通的临时表空间,不属于临时表空间组。
如果我们完全省略 TABLESPACE GROUP 子句,我们还将创建一个常规临时表空间,它不属于任何临时表空间组:

SQL> CREATE TEMPORARY TABLESPACE temp03 TEMPFILE '/u01/oracle/oradata/temp03_01.dbf' SIZE 500M;

临时表空间组的好处

使用临时表空间组,而不是通常的单个临时表空间,提供了几个好处:

  • SQL 查询不太可能用完排序空间,因为查询现在可以同时使用多个临时表空间进行排序。
  • 我们可以在数据库级别指定多个默认临时表空间。
  • 并行操作中的并行执行服务器将有效地利用多个临时表空间。
  • 单个用户可以在不同会话中同时使用多个临时表空间。

临时表空间组

大型事务有时会耗尽临时空间。
大型排序作业,尤其是那些涉及具有许多分区的表的作业,会导致大量使用临时表空间,从而可能导致性能问题。
Oracle 数据库 10g 引入了临时表空间组的概念,它允许用户在不同的会话中同时使用多个临时表空间。

以下是临时表空间组的一些主要特征:

  • 一个临时表空间组必须至少包含一个表空间。没有明确的最大表空间数。
  • 如果从临时表空间组中删除所有成员,该组也会自动删除。
  • 临时表空间组与属于该组的临时表空间具有相同的命名空间。
  • 临时表空间的名称不能与任何表空间组的名称相同。
  • 当我们将临时表空间分配给用户时,我们可以使用临时表空间组名称而不是实际的临时表空间名称。
  • 我们还可以在为数据库分配默认临时表空间时使用临时表空间组名称。

创建和更改用户时分配临时表空间组

创建新用户时,我们可以将他们分配给临时表空间组,而不是分配给单个临时表空间。
下面是一个例子:

SQL> CREATE USER TEST IDENTIFIED BY <PASSWORD>
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE tmpgrp1;
User created.
SQL>

创建用户后,还可以使用 ALTER USER 语句更改用户的临时表空间组。
这是执行此操作的 SQL 语句:

SQL> ALTER USER TEST TEMPORARY TABLESPACE tmpgrp2;

将组设置为数据库的默认临时表空间

我们可以使用临时表空间组作为数据库的默认临时表空间。
如果我们发出以下语句,则所有没有默认表空间的用户都可以使用 tmpgrp1 组中的任何临时表空间作为其默认临时表空间:

SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE tmpgrp1;

前面的 ALTER DATABASE 语句将 tmpgrp1 中的所有表空间分配为数据库的默认临时表空间。

查看临时表空间组信息

我们可以使用新的 DBA_TABLESPACE_GROUPS 数据字典视图来查询数据库中的临时表空间组。
这是对视图的简单查询,显示所有表空间组的名称:

SQL> SELECT group_name, tablespace_name FROM dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
---------- --------------
TMPGRP1    TEMP01

我们还可以使用 DBA_USERS 视图找出分配给每个用户的临时表空间或者临时表空间组。
下面是一个例子:

SQL> SELECT username, temporary_tablespace
FROM dba_users;
USERNAME TEMPORARY_TABLESPACE
-------- --------------------
SYS      TEMP
SYSTEM   TEMP
TEST    TMPGRP2
Oracle 临时表空间组
欢迎 on it road

将表空间添加到临时表空间组

如上一节所示,我们可以使用 ALTER TABLESPACE 命令将临时表空间添加到组中。
我们还可以使用 ALTER TABLESPACE 命令更改临时表空间属于哪个组。
例如,我们可以通过发出以下语句来指定表空间 temp02 属于 tmpgrp2 组:

SQL> ALTER TABLESPACE temp02 TABLESPACE GROUP tmpgrp2;

如果没有这样的组,数据库将创建一个名为 tmpgrp2 的新组。

临时表空间

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

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

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

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