臨時表大總結

lusklusklusk發表於2016-01-19

1.       Oracle的臨時表就是全域性臨時表,語法中必須加上GLOBAL,否則會報錯,這點和sqlserver不一樣,sqlserver存在什麼臨時表、全域性臨時表兩種概念

2.       表的定義對所有的會話可見。資料只在產生transactionsession的當前會話中有效

3.       可以對臨時表建立索引,檢視,觸發器

4.       可以用exportimport工具匯入匯出表的定義,但是不能匯出資料。

5.       建立在臨時表上的索引也是臨時的,也是隻對當前會話或者事務有效. 儘管對臨時表的DML操作速度比較快,但同樣也是要產生 Redo Log
LogMiner does not generate SQL redo for temporary tables. In such a case,
this column(V$LOGMNR_CONTENTS.SQL_REDO) will contain the string "/* No SQL_REDO for temporary tables */".
LogMiner does not generate SQL undo for temporary tables. In such a
case, this column(V$LOGMNR_CONTENTS.SQL_UNDO) will contain the string "/* No SQL_UNDO for temporary tables */".

6.       臨時表不存在併發,就不存在鎖,每個人看到的都是自己的東西 。臨時表的資料只在一個transactionsession中有效,沒有鎖的概念

7.       一個使用者的臨時表就放在當前使用者的臨時表空間中,建立臨時表後並不產生任何segments分配,與普通表不同dba_tables中看到臨時表對應的tablespace_name為空

8.       不管是事務級還是會話級,臨時表的結構以及後設資料還儲存在使用者的資料字典中。如果臨時表完成它的使命後,最好刪除臨時表,否則資料庫會殘留很多臨時表的表結構和後設資料。

 

 

 

例子:

SYSTEM.TEMP_TAB1事務級的臨時表

SYSTEM自己插入1條資料後不commitSYSTEM自己SELECT該表,發現有1條資料,SYS使用者可以SELECT到該表但是沒有資料。

commit後,SYSTEM自己SELECT該表也沒有資料了,SYS使用者可以SELECT到該表但是沒有資料

 

SYSTEM.TEMP_TAB2會話級的臨時表

SYSTEM自己插入1條資料後不commitSYSTEM自己SELECT該表,發現有1條資料,SYS使用者可以SELECT到該表但是沒有資料。

commit後,SYSTEM自己SELECT該表,發現有1條資料,SYS使用者可以SELECT到該表但是沒有資料。使用SYSTEM使用者重新開啟一個會話SELECT該表發現沒有資料了。退出可以SELECT到資料的當前SYSTEM使用者再重新進去SELECT後發現改表沒有資料了

 

SYSTEM.TEMP_TAB2會話級的臨時表

SYS使用者插入1條資料後不commitSYSTEM自己SELECT該表,發現沒有資料,SYS使用者可以SELECT到該表有1條資料。

 

 

事務級臨時表的資料只在當前事務有效,透過語句:ON COMMIT DELETE ROWS 指定(預設方式,如下兩行結果一致)。

CREATE GLOBAL TEMPORARY TABLE TEMP_TAB1(HID NUMBER,HNAME VARCHAR2(100))

CREATE GLOBAL TEMPORARY TABLE TEMP_TAB1(HID NUMBER,HNAME VARCHAR2(100)) ON COMMIT DELETE ROWS

 

會話級臨時表的資料只在當前會話有效,透過語句:ON COMMIT PRESERVE ROWS指定。

CREATE GLOBAL TEMPORARY TABLE TEMP_TAB2(HID NUMBER,HNAME VARCHAR2(100)) ON COMMIT PRESERVE ROWS;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-1979083/,如需轉載,請註明出處,否則將追究法律責任。

相關文章