當前位置:成語大全網 - 書法字典 - ORACLE臨時表概要

ORACLE臨時表概要

臨時表概念

臨時表是用於臨時存儲臨時數據(或中間數據)的數據庫對象。它有點類似於普通的桌子,但又有很大的不同。它只能存儲在臨時表空間中,而不是用戶的表空間中。ORACLE臨時表是會話級或事務級的,只對當前會話或事務可見。每個會話只能查看和修改自己的數據。

臨時表語法

clip_image002

臨時表分類

ORACLE臨時表有兩種類型:會話級臨時表和事務級臨時表。

1)

它是臨時表的默認參數,表示臨時表中的數據只在事務中有效。當事務被提交時,臨時表的臨時段將被自動截斷,但是臨時表的結構和元數據仍然存儲在用戶的數據字典中。如果臨時表完成了它的使命,最好刪除臨時表,否則數據庫會留下大量的表結構和臨時表的元數據。

2)提交時保留行

意思是臨時表的內容可以跨事物存在,但是當會話結束時,臨時表的臨時段會隨著會話的結束而被丟棄,臨時表中的數據自然也會被丟棄。但是,臨時表的結構和元數據也存儲在用戶的數據字典中。如果臨時表完成了它的使命,最好刪除臨時表,否則數據庫會留下大量的表結構和臨時表的元數據。

1:會話級臨時表中的數據與您當前的會話相關。如果當前會話不退出,臨時表中的數據將仍然存在,當您退出當前會話時,臨時表中的數據將被截斷表,如下所示:

會話級臨時表創建:

復制代碼

創建全局臨時表TMP_TEST

身份證號,

名稱VARCHAR2(32)

)在提交時保留行;

或者

在提交保留行時創建全局臨時表TMP_TEST

如同

SELECT * FROM TEST

操作示例:

SQL & gt創建全局臨時表TMP_TEST

身份證號,

名稱VARCHAR2(32)

)在提交時保留行;

表已創建

SQL & gt插入TMP_TEST

從DUAL中選擇1,' Kerry ';

1行已插入

SQL & gt提交;

提交完成

SQL & gtSELECT * FROM TMP _ TEST

ID名稱

- -

1凱瑞

SQL & gt插入TMP_TEST

從DUAL中選擇2個“rouce ”;

1行已插入

SQL & gt回滾;

回滾完成

SQL & gtSELECT * FROM TMP _ TEST

ID名稱

- -

1凱瑞

SQL & gt

復制代碼

2.事務級臨時表(默認)。這種類型的臨時表與事務相關。事務提交或回滾時,臨時表的數據會被自己截斷,即事務提交或回滾時,數據會被截斷,其他特性與會話級臨時表壹致。

事務級臨時表的創建方法:

復制代碼

創建全局臨時表TMP_TEST

身份證號,

名稱VARCHAR2(32)

)在提交時刪除行;

或者

在提交DELETE時創建全局臨時表TMP_TEST作為SELECT * FROM TEST

SQL & gt創建全局臨時表TMP_TEST

身份證號,

名稱VARCHAR2(32)

)在提交時刪除行;

表已創建

SQL & gt插入TMP_TEST

從DUAL中選擇1,' Kerry ';

1行已插入

SQL & gtSELECT * FROM TMP _ TEST

ID名稱

- -

1凱瑞

SQL & gt提交;

提交完成

SQL & gtSELECT * FROM TMP _ TEST

ID名稱

- -

SQL & gt

復制代碼

3:關於臨時表僅對當前會話或事務可見。每個會話只能查看和修改自己的數據。

用DM用戶登錄數據庫,打開SESSION 1,創建臨時表TMP_TEST。

復制代碼

創建全局臨時表TMP_TEST

身份證號,

名稱VARCHAR2(32)

)在提交時刪除行;

或者

在提交DELETE時創建全局臨時表TMP_TEST作為SELECT * FROM TEST

SQL & gt創建全局臨時表TMP_TEST

身份證號,

名稱VARCHAR2(32)

)在提交時刪除行;

表已創建

SQL & gt插入TMP_TEST

從DUAL中選擇1,' Kerry ';

1行已插入

SQL & gtSELECT * FROM TMP _ TEST

ID名稱

- -

1凱瑞

SQL & gt提交;

提交完成

SQL & gtSELECT * FROM TMP _ TEST

ID名稱

- -

SQL & gt

復制代碼

用sys用戶登錄數據庫,打開會話2。

Select * from DBA _ tables其中table _ name = ' tmp _ test '-可以找到臨時表數據。

SELECT * FROM DM。TMP _ TEST-找不到數據,即使TMP_TEST臨時表中有數據。

臨時表和永久表的區別

復制代碼

SQL & gtSELECT表名,表空間名,“日誌記錄”,

“臨時”、持續時間、“監控”

FROM DBA_TABLES,其中TABLE_NAME IN ('TMP_TEST ',' TEST ');

表名表空間名日誌記錄臨時持續時間監視

- - - - - -

測試TBS_EDS_DATA是N是

TMP _測試編號Y系統$會話編號

復制代碼

如上圖,臨時表存儲在臨時表空間中,但是從上面的腳本可以看出,臨時表並沒有在數據字典中指定它的表空間,臨時表為NOLOGGING,持續時間為SYS$SESSION。

臨時表的DML操作速度比較快,但是也會產生重做日誌,只是同樣的DML語句,比永久DML產生的少。實際上,在應用中,經常會創建壹個帶有NOLOGGING的永久表(中間表)來保存中間數據,從而取代臨時表。至於兩者的優劣,真的不好說清楚(歡迎討論)。

臨時表的使用

何時使用臨時表?使用臨時表和使用中間表有什麽區別?

我認為它在必要的時候被應用。以下是大衛·戴對臨時表的應用描述。我覺得很形象的說明了臨時表的應用場景:對於壹個電商網站來說,不同的消費者在網站上購物,這是壹個獨立的會話,把商品放進購物車,最後結算購物車裏的商品。換句話說,購物車中的信息必須在整個會話期間保存。與此同時,仍有壹些消費者往往在最終結賬時放棄購買商品。如果消費者購買信息直接存儲在最終表中(永久),必然會對最終表造成很大壓力。因此,對於這種情況,我們可以通過創建ON COMMIT PRESERVE行來解決。數據僅在進程期間有效。對於已經成功結算的有效數據,ORACLE會在臨時數據轉移到最終表後自動截斷。對於放棄結算的數據,ORACLE也自動截斷,不進行編碼控制,最終表只處理有效訂單,減輕了頻繁DML操作的壓力。

1:處理壹批臨時數據時,多個DML操作(插入、更新等。)都需要,建議使用臨時表。

2.當查詢中有壹些表需要多次用於連接時。(為了獲得目標數據,妳需要關聯A、B、C,同時,為了獲得另壹個目標數據,妳需要關聯D、B、C...)

關於臨時表和中間表(NOLOGGING)哪個更適合存儲中間數據,我個人更傾向於使用臨時表而不是中間表。

需要註意的事項

1)不支持lob對象,這可能是基於設計者對運行效率的考慮,但在實際應用中真正需要該功能時,不能使用臨時表。網上很多資料都是這麽說的。我沒有跟蹤哪個版本不支持lob對象。至少在ORACLE 10g中,臨時表支持lob對象。

SQL & gt創建全局臨時表TMP_TEST

2 (

3身份證號,

4名稱CLOB

5)在提交時保留行;

表已創建

SQL & gt

SQL & gt插入TMP_TEST

2從DUAL中選擇1,‘ADF’;

1行已插入

SQL & gtSELECT * FROM V $ VERSION

旗幟

-

Oracle數據庫10g企業版版本10.2.0.1.0 -產品

PL/SQL版本10.2.0.1.0 -生產

核心1.0生產

32位Windows的TNS:版本10.2.0.1.0 -生產

NLSRTL版本10.2.0.1.0 -生產

2)不支持主鍵和外鍵關系。

3)臨時表不能永久存儲數據。

4)臨時表的數據不會被備份和恢復,也不會有修改的日誌信息。

5)臨時表沒有DML鎖。

不會在臨時表的數據上獲取DML鎖。LOCK語句對臨時表沒有影響,因為每個會話都有自己的私有數據。

6)雖然臨時表上的DML操作速度比較快,也需要生成重做日誌,但是同樣的DML語句比永久DML生成的少。請看官方文件:

臨時表上的DML語句不會為數據更改生成重做日誌。但是,會生成數據的撤消日誌和撤消日誌的重做日誌。在會話終止的情況下,當用戶註銷或會話異常終止(如會話或實例失敗)時,會自動刪除臨時表中的數據。

7)臨時表可以創建臨時索引、視圖和觸發器。

8)如果您想要刪除會話級臨時表並且它包含數據,您必須首先截斷其中的數據。否則,您將報告壹個錯誤。

SQL & gt刪除表TMP _ TEST PURGE

刪除表TMP _測試清除

ORA-14452:試圖在使用中的臨時表中創建、更改或刪除索引。

SQL & gt截斷表TMP _ TEST

表格被截斷

SQL & gt刪除表TMP _ TEST PURGE

表格已刪除