Oracle 臨時事務表 全局臨時表_global Temporary Table

所有的操作都在一個事務裏,事務提交後,此表清空,特別適合做插入刪除頻率特別高的臨時表操作,比如插入完數據就開始查詢,查詢完就刪掉等,用完就扔!

臨時表分事務級臨時表和會話級臨時表。 
事務級臨時表只對當前事務有效,通過語句:ON COMMIT DELETE ROWS 指定。 
會話級臨時表對當前會話有效,通過語句:ON COMMIT PRESERVE ROWS語句指定。

-- Create table

create global temporary table WFM_TMP_WORKLIST

(

  proc_inst_id NUMBER(10),

  workitem_id  NUMBER(10),

  buzicondi    NVARCHAR2(500)

)

on commit delete rows;


---全局臨時表創建語法
SQL> create global temporary table t_global_temp(a int)
  2  on commit delete rows;

Table created.

---查詢表名
SQL> select table_name from user_tables where table_name='T_GLOBAL_TEMP';

TABLE_NAME
------------------------------------------------------------
T_GLOBAL_TEMP

--查詢表對應的segment
SQL> select segment_name,segment_type from user_segments where segment_name='T_G
LOBAL_TEMP';

no rows selected

---插入數據
SQL> insert into t_global_temp values(1);

1 row created.

SQL> commit;

Commit complete.

--提交查詢無記錄
SQL> select * from t_global_temp;

no rows selected

--再次查詢segment無記錄,原因:創建全局臨時表指定on commit delete rows一提交即清表
SQL> select segment_name,segment_type from user_segments where segment_name='T_G
LOBAL_TEMP';

no rows selected


SQL> insert into t_global_temp values(1);

1 row created.

--插入不提交即可查詢到記錄
SQL> select segment_name,segment_type from user_segments where segment_name='T_G
LOBAL_TEMP';

no rows selected

--提交與否皆不佔用存儲空間,引申問題:哪全局臨時表的數據存儲在哪兒呢?
SQL> select segment_name,segment_type from user_segments where segment_name='T_G
LOBAL_TEMP';

no rows selected


---以基於會話方式創建全局臨時表
SQL> create global temporary table t_global_temp(a int) on commit preserve rows;


Table created.

SQL> insert into t_global_temp values(1);

1 row created.

---提交前查詢
SQL> select * from t_global_temp;

         A
----------
         1

SQL> select segment_name,segment_type from user_segments where segment_name='T_G
LOBAL_TEMP';

no rows selected

SQL> commit;

Commit complete.

--提交後查詢
SQL> select * from t_global_temp;

         A
----------
         1

---附上提交前後在另一會話查全局臨時表測試,全局臨時表的數據僅在當前會話可見
SQL> select * from t_global_temp;

no rows selected

SQL> /

no rows selected

SQL> desc t_global_temp;
 Name                                      Null?    Type
 ----------------------------------------- -------- -----------------------

 A                                                  NUMBER(38)

---測試全局臨時表的alter table及create index及alter index
--如全局臨時表正在使用alter table不能運行
SQL> alter table t_global_temp add b int;
alter table t_global_temp add b int
*
ERROR at line 1:
ORA-14450: attempt to access a transactional temp table already in use

---只有退出當前會話
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64
bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

C:\Users\123>sqlplus scott/system

SQL*Plus: Release 11.2.0.1.0 Production on Wed Jan 9 16:07:10 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

---再次alter table即可成功
SQL> alter table t_global_temp add b int;

Table altered.

---在全局臨時表構建索引
SQL> create index idx_temp on t_global_temp(a);

Index created.

--刪除全局臨時表索引
SQL> drop index idx_temp;

Index dropped.

SQL> select count(*) from t_global_temp;

  COUNT(*)
----------
         0

SQL> insert into t_global_temp select 1,3 from dual connect by level<3e5;

299999 rows created.

SQL> commit;

Commit complete.

---收集全局臨時表的統計信息
SQL> exec dbms_stats.gather_table_stats(user,'t_global_temp');

PL/SQL procedure successfully completed.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------

Plan hash value: 62698482

----------------------------------------------------------------------------
| Id  | Operation          | Name          | Rows  | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |               |     1 |   257   (4)| 00:00:04 |
|   1 |  SORT AGGREGATE    |               |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T_GLOBAL_TEMP |   599K|   257   (4)| 00:00:04 |
----------------------------------------------------------------------------

9 rows selected.

---僅插一條a值888888888888888888888的記錄到全局臨時表
SQL> insert into t_global_temp select 888888888888888888888,1 from dual;

1 row created.

SQL> commit;

Commit complete.

SQL> explain plan for select count(*) from t_global_temp where a=88888888888888
888888;

Explained.

--執行計劃顯示走了索引
SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------

Plan hash value: 1743356947

------------------------------------------------------------------------------
| Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |          |     1 |     3 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE   |          |     1 |     3 |            |          |
|*  2 |   INDEX RANGE SCAN| IDX_TEMP |     1 |     3 |     3   (0)| 00:00:01 |
------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------

---------------------------------------------------

   2 - access("A"=888888888888888888888)

14 rows selected.

----全局臨時表的操作限制

----不能分區,不能集簇化,不能iot化
Temporary tables cannot be partitioned, clustered, or index organized.
 
---不能指定外鍵約束
You cannot specify any foreign key constraints on temporary tables.
 
---不能包含nested table column
Temporary tables cannot contain columns of nested table.
 
----不能指定lob_storage_clause的參數:tablespace,storage_clause or logging_clause
You cannot specify the following clauses of the LOB_storage_clause: TABLESPACE, storage_clause, or logging_clause.
 
---不能啓用並行update,delte,merge
Parallel UPDATE, DELETE and MERGE are not supported for temporary tables.
 
---在segment_atrributes_clause子句中,唯一可指定的參數是:tablespace
The only part of the segment_attributes_clause you can specify for a temporary table is TABLESPACE, which allows you to specify a single temporary tablespace.
 
---不支持分佈式事務
Distributed transactions are not supported for temporary tables.


小結:全局臨時表特別適用於存儲中轉結果,即臨時計算的結果,非最終結果;
     可用於報表統計存儲過程.


發佈了104 篇原創文章 · 獲贊 16 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章