关于创建全局临时表
全局临时表的元数据对多个用户及其会话可见,但其内容是会话本地的。
例如,假设基于 Web 的航空公司预订应用程序允许客户创建多个可选行程。每个行程都由全局临时表中的一行表示。应用程序更新行以反映行程中的变化。当客户决定她想要使用哪个行程时,应用程序将该行程的行移动到一个持久表中。
当客户决定她想要使用哪个行程时,应用程序将该行程的行移动到一个持久表中。
在会话期间,行程数据是私有的。在会话结束时,可选的行程将被删除。
全局临时表的定义对所有会话可见,但全局临时表中的数据仅对向表中插入数据的会话可见。
使用该CREATE GLOBAL TEMPORARY TABLE
语句创建一个全局临时表。该ON COMMIT
子句指示表中的数据是特定于事务(默认)还是特定于会话,其含义如下:
ON COMMIT 设置 | 影响 |
---|---|
|
这将创建一个特定于事务的全局临时表。会话绑定到全局临时表,事务首先插入表中。绑定在事务结束时消失。每次提交后,数据库都会截断表(删除所有行)。 |
|
这将创建一个特定于会话的全局临时表。会话绑定到全局临时表,第一次插入到会话中的表中。此绑定在会话结束时消失或通过在会话中发出 |
创建全局临时表
此语句创建特定于事务的全局临时表:
CREATE GLOBAL TEMPORARY TABLE admin_work_area_trans (startdate DATE, enddate DATE, class CHAR(20)) ON COMMIT DELETE ROWS;
此语句创建特定于会话的全局临时表:
CREATE GLOBAL TEMPORARY TABLE admin_work_area_session (startdate DATE, enddate DATE, class CHAR(20)) ON COMMIT PRESERVE ROWS;
可以在全局临时表上创建索引。它们也是临时的,索引中的数据与基础表中的数据具有相同的会话或事务范围。
默认情况下,全局临时表中的行存储在创建该表的用户的默认临时表空间中。但是,在创建全局临时表时,可以使用CREATE global temporary table的tablespace子句将全局临时表分配给另一个表空间。您可以使用此功能来节省全局临时表使用的空间。例如,如果必须执行许多小型全局临时表操作,并且为排序操作配置了默认临时表空间,因此使用了较大的数据块大小,那么这些小型操作将消耗大量不必要的磁盘空间。在这种情况下,最好分配一个具有较小扩展数据块大小的第二个临时表空间。
以下两个语句创建一个扩展大小为64 KB的临时表空间,然后在该表空间中创建一个新的全局临时表。
CREATE TEMPORARY TABLESPACE tbs_t1 TEMPFILE 'tbs_t1.f' SIZE 50m REUSE AUTOEXTEND ON MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K; CREATE GLOBAL TEMPORARY TABLE admin_work_area (startdate DATE, enddate DATE, class CHAR(20)) ON COMMIT DELETE ROWS TABLESPACE tbs_t1;
注意:根据初始化参数private_temp_table_prefix,私有临时表的名称必须加前缀。
Creating a Private Temporary Table
此语句创建特定于事务的专用临时表:
CREATE PRIVATE TEMPORARY TABLE ORA$PTT_sales_ptt_transaction (time_id DATE, amount_sold NUMBER(10,2)) ON COMMIT DROP DEFINITION;
此语句创建会话特定的专用临时表:
CREATE PRIVATE TEMPORARY TABLE ORA$PTT_sales_ptt_session (time_id DATE, amount_sold NUMBER(10,2)) ON COMMIT PRESERVE DEFINITION;
默认情况下,私有临时表中的行存储在创建该表的用户的默认临时表空间中。但是,在创建临时表的过程中,可以使用CREATE private temporary table语句的tablespace子句将专用临时表分配给另一个临时表空间。
并行化表创建
当您指定AS SELECT
子句来创建一个表并使用另一个表中的数据填充它时,您可以使用并行执行。
略。。。。