GLOBAL TEMPORARY TABLE


轉自:http://tolywang.itpub.net/index.php
 
CREATE GLOBAL TEMPORARY TABLE TABLENAME (
COL1 VARCHAR2(10),
COL2 NUMBER
) ON COMMIT PRESERVE(DELETE) ROWS ;
這種臨時表不占用表空間,而且不同的SESSION之間互相看不到對方的數據
在會話結束后表中的數據自動清空,如果選了DELETE ROWS,則在提交的時候即清空數據,PRESERVE則一直到會話結束



Oracle8i中,可以創建以下兩種臨時表:
(1)會話特有的臨時表
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)
ON COMMIT PRESERVE ROWS;

(2)事務特有的臨時表
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)
ON COMMIT DELETE ROWS;
CREATE GLOBAL TEMPORARY TABLE MyTempTable
所建的臨時表雖然是存在的,但是你試一下insert 一條記錄然后用別的連接登上去select,記錄是空的,明白了吧,我把下面兩句話再貼一下:
--ON COMMIT DELETE ROWS 說明臨時表是事務指定,每次提交后ORACLE將截斷表(刪除全部行)
--ON COMMIT PRESERVE ROWS 說明臨時表是會話指定,當中斷會話時ORACLE將截斷表。
沖突的問題更本不用考慮.

臨時表只是保存當前會話(session)用到的數據,數據只在事務或會話期間存在。

通過CREATE GLOBAL TEMPORARY TABLE命令創建一個臨時表,對於事務類型的臨時表,
數據只是在事務期間存在,對於會話類型的臨時表,數據在會話期間存在。

會話的數據對於當前會話私有。每個會話只能看到並修改自己的數據。DML鎖不會加到
臨時表的數據上。下面的語句控制行的存在性。

● ON COMMIT DELETE ROWS 表名行只是在事務期間可見
● ON COMMIT PRESERVE ROWS 表名行在整個會話期間可見

可以對臨時表創建索引,視圖,出發器,可以用export和import工具導入導出表的
定義,但是不能導出數據。表的定義對所有的會話可見。

例如:
CREATE GLOBAL TEMPORARY TABLE TEMP_TAB1(
table_name VARCHAR2(20),
primary_key VARCHAR2(100),
field VARCHAR2(1000))
ON COMMIT PRESERVE ROWS;

CREATE GLOBAL TEMPORARY TABLE TEMP_TAB2(
table_name VARCHAR2(20),
primary_key VARCHAR2(100),
field VARCHAR2(1000))
ON COMMIT DELETE ROWS;
 

近年我做的項目中較少使用臨時表Temporary Table ,其實 Temp Table 還是可以有比較廣泛的應用的。

Temp Table 的特點

(1) 多用戶操作的獨立性:對於使用同一張臨時表的不同用戶,ORACLE都會分配一個獨立的 Temp Segment,這樣就避免了多個用戶在對同一張臨時表操作時發生交叉,從而保證了多個用戶操作的並發性和獨立性;

(2) 數據的臨時性:既然是臨時表,顧名思義,存放在該表中的數據是臨時性的。ORACLE根據你創建臨時表時指定的參數(On Commit Delete Rows / On Commit Preserve Rows),自動將數據TRUNCATE掉。

 

Temp Table 數據的時效性

(1)On Commit Delete Rows : 數據在 Transaction 期間有效,一旦COMMIT后,數據就被自動 TRUNCATE 掉了;

SQL> CREATE GLOBAL TEMPORARY TABLE QCUI_Temp_Trans

2 ON COMMIT DELETE ROWS

3 AS

4 SELECT * FROM t_Department;

 

表已創建。

—————————————————————————————————

SQL> INSERT INTO QCUI_Temp_Trans

2 SELECT * FROM t_Dept;

 

已創建4行。

——————————————————————————————

SQL> SELECT * FROM QCUI_Temp_Trans;

 

DEPTID DEPTNAME

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

101 銷售部

201 財務部

301 貨運部

401 采購部

——————————————————————————————

SQL> commit;

 

提交完成。

——————————————————————————————

SQL> SELECT * FROM QCUI_Temp_Trans;

 

未選定行

——————————————————————————————

(2)On Commit Preserve Rows :數據在 Session 期間有效,一旦關閉了Session 或 Log Off 后,數據就被 ORACLE 自動 Truncate 掉。

SQL> CREATE GLOBAL TEMPORARY TABLE QCUI_Temp_Sess

2 ON COMMIT PRESERVE ROWS

3 AS

4 SELECT * FROM t_Department;

 

表已創建。

——————————————————————————————

SQL> Select * from QCUI_Temp_Sess;

 

DEPTID DEPTNAME

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

101 銷售部

301 貨運部

401 采購部

201 財務部

——————————————————————————————

SQL> exit

——————————————————————————————

C:Documents and SettingsQCUI>sqlplus sqltrainer@ibm

——————————————————————————————

SQL> SELECT * FROM QCUI_Temp_Sess;

 

未選定行

——————————————————————————————

 

注:這里要說明的是,ORACLE Truncate 掉的數據僅僅是分配給不同 Session 或 Transaction的 Temp Segment 上的數據,而不是將整張表數據 TRUNCATE 掉。

 

Temp Table 的應用

Temp Table 就我理解而言,主要有兩方面應用。

對於一個電子商務類網站,不同消費者在網站上購物,就是一個獨立的 SESSION,選購商品放進購物車中,最后將購物車中的商品進行結算。也就是說,必須在整個SESSION期間保存購物車中的信息。同時,還存在有些消費者,往往最終結賬時放棄購買商品。如果,直接將消費者選購信息存放在最終表(PERMANENT)中,必然對最終表造成非常大的壓力。

因此,對於這種案例,就可以采用創建臨時表( ON COMMIT PRESERVE ROWS )的方法來解決。數據只在 SESSION 期間有效,對於結算成功的有效數據,轉移到最終表中后,ORACLE自動TRUNCATE 臨時數據;對於放棄結算的數據,ORACLE 同樣自動進行 TRUNCATE ,而無須編碼控制,並且最終表只處理有效訂單,減輕了頻繁的DML的壓力。

Temp Table 的另一個應用,就是存放數據分析的中間數據。

 

Temp Table 存放在哪兒?

Temp Table 並非存放在用戶的表空間中,而是存放在 Schema 所指定的臨時表空間中。

SQL> Select Table_Name, Tablespace_Name

2 From User_Tables

3 Where Table_Name Like 'QCUI%';

 

TABLE_NAME TABLESPACE_NAME

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

QCUI_TEMP_SESS

QCUI_TEMP_TRANS

——————————————————————————————

可見這兩張臨時表並未存放在用戶的表空間中。

用戶 SQLTRAINER 的臨時表空間是 TEMP , 用戶創建的臨時表是存放在TEMP表空間中的。下面來證明

SQL> SELECT UserName, Default_Tablespace def_ts, Temporary_Tablespace temp_ts

2 FROM User_Users;

 

USERNAME DEF_TS TEMP_TS

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

SQLTRAINER ts_ORASQLTraining TEMP

——————————————————————————————

SQL> connect system/manager@ibm

已連接。

SQL> alter tablespace temp offline;

 

表空間已更改。

——————————————————————————————

SQL> connect sqltrainer/sqltrainer@ibm

已連接。

SQL> INSERT INTO QCUI_Temp_Sess

2 SELECT * FROM t_Department;

INSERT INTO QCUI_Temp_Sess

*

ERROR 位於第 1 行:

ORA-01542: 表空間'TEMP'脫機,無法在其中分配空間

——————————————————————————————

 

對 Temp Table 的 DML 操作是否不產生 Redo Log ?

盡管對臨時表的DML操作速度比較快,但同樣也是要產生 Redo Log 的,只是同樣的DML語句,比對 PERMANENT 的DML 產生的Redo Log 少。

SQL> Set AutoTrace On

SQL> CREATE GLOBAL TEMPORARY TABLE QCUI_Temp_Sess_AllObj

2 ON COMMIT PRESERVE ROWS

3 AS

4 SELECT * FROM All_Objects;

 

表已創建。

 

SQL> INSERT INTO QCUI_Temp_Sess_AllObj

2 SELECT * FROM All_Objects;

 

已創建21839行。

 

Statistics

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

……

168772 redo size

……

——————————————————————————————

SQL> CREATE TABLE QCUI_ALL_OBJECTS

2 AS

3 SELECT * FROM All_Objects

4 WHERE 1 = 0;

 

表已創建。

 

SQL> INSERT INTO QCUI_All_Objects

2 SELECT * FROM ALL_Objects;

 

已創建21839行。

 

Statistics

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

……

2439044 redo size

……——————————————————————————————

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM