當前位置:首頁 » 數據倉庫 » oracle資料庫臨時表
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

oracle資料庫臨時表

發布時間: 2022-08-07 13:28:45

A. Oracle資料庫臨時表空間用途問題

Oracle臨時表空間主要用來做查詢和存放一些緩沖區數據。臨時表空間消耗的主要原因是需要對查詢的中間結果進行排序。重啟資料庫可以釋放臨時表空間,如果不能重啟實例,而一直保持問題sql語句的執行,temp表空間會一直增長

Oracle臨時表空間主要用來做查詢和存放一些緩沖區數據。臨時表空間消耗的主要原因是需要對查詢的中間結果進行排序。

重啟資料庫可以釋放臨時表空間,如果不能重啟實例,而一直保持問題sql語句的執行,temp表空間會一直增長。直到耗盡硬碟空間。

B. oracle 怎麼在存儲過程中創建一個臨時表,在裡面插入數據,再查找這個臨時表的所有數據,最後drop這個表。

Oracle
的臨時表的
處理機制,

SQL
Server
的不一樣。
假如你的臨時表的結構不是每次執行都發生變化的話
那麼就是事先
通過
CREATE
GLOBAL
TEMPORARY
TABLE
語句,把臨時表建立好。
存儲過程裡面,就根據需要,
執行
INSERT
/
SELECT
之類的操作就可以了

C. ORACLE臨時表總結

臨時表概念
臨時表就是用來暫時保存臨時數據(亦或叫中間數據)的一個資料庫對象,它和普通表有些類似,然而又有很大區別。它只能存儲在臨時表空間,而非用戶的表空間。ORACLE臨時表是會話或事務級別的,只對當前會話或事務可見。每個會話只能查看和修改自己的數據。
臨時表語法
clip_image002
臨時表分類
ORACLE臨時表有兩種類型:會話級的臨時表和事務級的臨時表。
1)ON COMMIT DELETE ROWS
它是臨時表的默認參數,表示臨時表中的數據僅在事物過程(Transaction)中有效,當事物提交(COMMIT)後,臨時表的暫時段將被自動截斷(TRUNCATE),但是臨時表的結構 以及元數據還存儲在用戶的數據字典中。如果臨時表完成它的使命後,最好刪除臨時表,否則資料庫會殘留很多臨時表的表結構和元數據。
2)ON COMMIT PRESERVE ROWS
它表示臨時表的內容可以跨事物而存在,不過,當該會話結束時,臨時表的暫時段將隨著會話的結束而被丟棄,臨時表中的數據自然也就隨之丟棄。但是臨時表的結構以及元數據還存儲在用戶的數據字典中。如果臨時表完成它的使命後,最好刪除臨時表,否則資料庫會殘留很多臨時表的表結構和元數據。
1:會話級的臨時表的數據和你當前會話有關系,當前SESSION不退出的情況下,臨時表中的數據就還存在,臨時表的數據只有當你退出當前SESSION的時候才被截斷(TRUNCATE TABLE),如下所示:
會話級別的臨時表創建:
復制代碼
CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT PRESERVE ROWS;

CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT PRESERVE ROWS
AS
SELECT * FROM TEST;
操作示例:
SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT PRESERVE ROWS;
Table created
SQL> INSERT INTO TMP_TEST
SELECT 1, 'kerry' FROM DUAL;
1 row inserted
SQL> COMMIT;
Commit complete
SQL> SELECT * FROM TMP_TEST;
ID NAME
---------- ----------------
1 kerry
SQL> INSERT INTO TMP_TEST
SELECT 2, 'rouce' FROM DUAL;
1 row inserted
SQL> ROLLBACK;
Rollback complete
SQL> SELECT * FROM TMP_TEST;
ID NAME
---------- ----------------------
1 kerry
SQL>
復制代碼
2:事務級的臨時表(默認),這種類型的臨時表與事務有關,當進行事務提交或者事務回滾的時候,臨時表的數據將自行截斷,即當COMMIT或ROLLBACK時,數據就會被TRUNCATE掉,其它的特性和會話級的臨時表一致。
事務級臨時表的創建方法:
復制代碼
CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT DELETE ROWS;

CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT DELETE AS SELECT * FROM TEST;
SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT DELETE ROWS;
Table created
SQL> INSERT INTO TMP_TEST
SELECT 1, 'kerry' FROM DUAL;
1 row inserted
SQL> SELECT * FROM TMP_TEST;
ID NAME
---------- ----------------------
1 kerry
SQL> COMMIT;
Commit complete
SQL> SELECT * FROM TMP_TEST;
ID NAME
---------- ------------------------
SQL>
復制代碼
3:關於臨時表只對當前會話或事務可見。每個會話只能查看和修改自己的數據。
用DM用戶登錄資料庫,打開SESSION 1後,創建臨時表TMP_TEST
復制代碼
CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT DELETE ROWS;

CREATE GLOBAL TEMPORARY TABLE TMP_TEST ON COMMIT DELETE AS SELECT * FROM TEST;
SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST
(
ID NUMBER ,
NAME VARCHAR2(32)
) ON COMMIT DELETE ROWS;
Table created
SQL> INSERT INTO TMP_TEST
SELECT 1, 'kerry' FROM DUAL;
1 row inserted
SQL> SELECT * FROM TMP_TEST;
ID NAME
---------- ---------------------
1 kerry
SQL> COMMIT;
Commit complete
SQL> SELECT * FROM TMP_TEST;
ID NAME
---------- -----------------------
SQL>
復制代碼
用sys用戶登錄資料庫,打開SESSION 2
SELECT * FROM DBA_TABLES WHERE TABLE_NAME='TMP_TEST' --可以查到臨時表數據
SELECT * FROM DM.TMP_TEST; --查不到數據,即使TMP_TEST臨時表存在數據。
臨時表與永久表區別
復制代碼
SQL> SELECT TABLE_NAME, TABLESPACE_NAME,"LOGGING",
"TEMPORARY", DURATION, "MONITORING"
FROM DBA_TABLES WHERE TABLE_NAME IN ('TMP_TEST', 'TEST') ;
TABLE_NAME TABLESPACE_NAME LOGGING TEMPORARY DURATION MONITORING
------------- -------------- ------- --------- ----------- ---------
TEST TBS_EDS_DATA YES N YES
TMP_TEST NO Y SYS$SESSION NO
復制代碼
如上所示,臨時表是存儲在臨時表空間裡面的,但是上面腳本可以看出,臨時表在數據字典中沒有指定其表空間,臨時表是NOLOGGING,DURATION為SYS$SESSION
臨時表的DML操作速度比較快,但同樣也是要產生 Redo Log ,只是同樣的DML語句,比對 PERMANENT 的DML 產生的Redo Log 少其實在應用中,往往會創建一個NOLOGGING的永久表(中間表)來保存中間數據,從而代替臨時表,至於這這兩者有啥優劣,真是很難說清道明(歡迎大家探討)。
臨時表用途
什麼時候使用臨時表?用臨時表和用中間表有啥區別呢?
我覺得是在需要的時候應用,下面是David Dai關於臨時表的一個應用說明,我覺得非常形象的說明了臨時表的應用場景:對於一個電子商務類網站,不同消費者在網站上購物,就是一個獨立的 SESSION,選購商品放進購物車中,最後將購物車中的商品進行結算。也就是說,必須在整個SESSION期間保存購物車中的信息。同時,還存在有些消費者,往往最終結賬時放棄購買商品。如果,直接將消費者選購信息存放在最終表(PERMANENT)中,必然對最終表造成非常大的壓力。因此,對於這種案例,就可以採用創建臨時表(ON COMMIT PRESERVE ROWS)的方法來解決。數據只在 SESSION 期間有效,對於結算成功的有效數據,轉移到最終表中後,ORACLE自動TRUNCATE 臨時數據;對於放棄結算的數據,ORACLE 同樣自動進行 TRUNCATE ,而無須編碼控制,並且最終表只處理有效訂單,減輕了頻繁的DML操作的壓力。
1:當處理某一批臨時數據,需要多次DML操作時(插入、更新等),建議使用臨時表。
2:當某些表在查詢裡面,需要多次用來做連接時。(為了獲取目標數據需要關聯A、B、C, 同時為了獲取另外一個目標數據,需要關聯D、B、C....)
關於臨時表和中間表(NOLOGGING,保存中間數據,使用完後刪除)那個更適合用來存儲中間數據,我個人更傾向於使用臨時表,而不建議使用中間表。
注意事項
1 ) 不支持 lob 對象,這也許是設計者基於運行效率的考慮,但實際應用中確實需要此功能時就無法使用臨時表了。這點網上很多資料都這么說,我沒有追查到底是那個版本不支持lob對象,至少在ORACLE 10g這個版本中,臨時表是支持lob對象的.
SQL> CREATE GLOBAL TEMPORARY TABLE TMP_TEST
2 (
3 ID NUMBER ,
4 NAME CLOB
5 ) ON COMMIT PRESERVE ROWS;
Table created
SQL>
SQL> INSERT INTO TMP_TEST
2 SELECT 1, 'ADF' FROM DUAL;
1 row inserted
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Proction
CORE 10.2.0.1.0 Proction
TNS for 32-bit Windows: Version 10.2.0.1.0 - Proction
NLSRTL Version 10.2.0.1.0 - Proction
2 ) 不支持主外鍵關系
3 )臨時表不能永久的保存數據。
4 )臨時表的數據不會備份,恢復,對其的修改也不會有任何日誌信息
5 )臨時表不會有DML 鎖
DML locks are not acquired on the data of the temporary tables. The LOCK statement has no effect on a temporary table, because each session has its own private data.
6 )盡管對臨時表的DML操作速度比較快,但同樣也是要產生 Redo Log ,只是同樣的DML語句,比對 PERMANENT 的DML 產生的Redo Log 少。請見官方文檔:
DML statements on temporary tables do not generate redo logs for the data changes.However, undo logs for the data and redo logs for the undo logs are generated. Data from the temporary table is automatically dropped in the case of session termination,either when the user logs off or when the session terminates abnormally such as ring a session or instance failure.
7 ) 臨時表可以創建臨時的索引、視圖、觸發器。
8 ) 如果要DROP會話級別臨時表,並且其中包含數據時,必須先截斷其中的數據。否則會報錯。
SQL> DROP TABLE TMP_TEST PURGE;
DROP TABLE TMP_TEST PURGE
ORA-14452: 試圖創建, 更改或刪除正在使用的臨時表中的索引
SQL> TRUNCATE TABLE TMP_TEST;
Table truncated
SQL> DROP TABLE TMP_TEST PURGE;
Table dropped

D. 在oracle中普通表和臨時表的區別

臨時表是只有創建的用戶才可以使用的,用戶退出或事務結束時(具體看on commit 選項)自動刪除該表,也可以手動drop。

在臨時表上的操作比在一般的表上的操作要快。

建臨時表是動態編譯的,所以對臨時表的使用也必須放在DECLARE CURSER 後面。

對普通表的DML,建觸發器等操作同樣適合臨時表,與普通表不同的是,臨時表使用的是PGA,如果PGA空間不夠了才會使用臨時表空間。

E. oracle臨時表有幾種

Oracle臨時表可以說是提高資料庫處理性能的好方法,在沒有必要存儲時,只存儲在Oracle臨時表空間中。希望本文能對大家有所幫助。
1 、前言
目前所有使用 Oracle 作為資料庫支撐平台的應用,大部分數據量比較龐大的系統,即表的數據量一般情況下都是在百萬級以上的數據量。
當然在 Oracle 中創建分區是一種不錯的選擇,但是當你發現你的應用有多張表關聯的時候,並且這些表大部分都是比較龐大,而你關聯的時候發現其中的某一張或者某幾張表關聯之後得到的結果集非常小並且查詢得到這個結果集的速度非常快,那麼這個時候我考慮在 Oracle 中創建「臨時表」。
我對臨時表的理解:在 Oracle 中創建一張表,這個表不用於其他的什麼功能,主要用於自己的軟體系統一些特有功能才用的,而當你用完之後表中的數據就沒用了。 Oracle 的臨時表創建之後基本不佔用表空間,如果你沒有指定臨時表(包括臨時表的索引)存放的表空的時候,你插入到臨時表的數據是存放在 ORACLE 系統的臨時表空間中( TEMP )。
2 、臨時表的創建
創建Oracle 臨時表,可以有兩種類型的臨時表:
會話級的臨時表
事務級的臨時表 。
1) 會話級的臨時表因為這這個臨時表中的數據和你的當前會話有關系,當你當前SESSION 不退出的情況下,臨時表中的數據就還存在,而當你退出當前SESSION 的時候,臨時表中的數據就全部沒有了,當然這個時候你如果以另外一個SESSION 登陸的時候是看不到另外一個SESSION 中插入到臨時表中的數據的。即兩個不同的SESSION 所插入的數據是互不相乾的。當某一個SESSION 退出之後臨時表中的數據就被截斷(truncate table ,即數據清空)了。會話級的臨時表創建方法:

Create Global Temporary Table Table_Name (Col1 Type1,Col2 Type2...) On Commit Preserve Rows ;

舉例:

create global temporary table Student (Stu_id Number(5), Class_id Number(5), Stu_Name Varchar2(8), Stu_Memo varchar2(200)) on Commit Preserve Rows ;

2) 事務級臨時表是指該臨時表與事務相關,當進行事務提交或者事務回滾的時候,臨時表中的數據將自行被截斷,其他的內容和會話級的臨時表的一致(包括退出SESSION 的時候,事務級的臨時表也會被自動截斷)。事務級臨時表的創建方法:

Create Global Temporary Table Table_Name (Col1 Type1,Col2 Type2...) On Commit Delete Rows ;

舉例:
create global temporary table Classes
(Class_id Number(5),
Class_Name Varchar2(8),
Class_Memo varchar2(200)) on Commit delete Rows ;
3) 兩中類型臨時表的區別
會話級臨時表採用 on commit preserve rows ;而事務級則採用 on commit delete rows ;用法上,會話級別只有當會話結束臨時表中的數據才會被截斷,而且事務級臨時表則不管是 commit 、 rollback 或者是會話結束,臨時表中的數據都將被截斷
4 )什麼時候使用臨時表
1 )、當某一個 SQL 語句關聯的表在 2 張及以上,並且和一些小表關聯。可以採用將大表進行分拆並且得到比較小的結果集合存放在臨時表中
2 )、程序執行過程中可能需要存放一些臨時的數據,這些數據在整個程序的會話過程中都需要用的等等。
3 . 例子:略
4 .臨時表的不足之處
1 )不支持 lob 對象,這也許是設計者基於運行效率的考慮,但實際應用中確實需要此功能時就無法使用臨時表了。
2 )不支持主外鍵關系
所以,由於以上原因,我們可以自己創建臨時表,以彌補 oracle 臨時表的不足之處
上面的都是本人經過測試的,但下面是在網上搜索到的方法,本人具體沒有測試過,不過覺得可行性很強,有時間測試下
創建方法:
1 、以常規表的形式創建臨時數據表的表結構,但要在每一個表的主鍵中加入一個 SessionID 列以區分不同的會話。(可以有 lob 列和主外鍵)
2 、寫一個用戶注銷觸發器,在用戶結束會話的時候刪除本次會話所插入的所有記錄 (SessionID 等於本次會話 ID 的記錄 ) 。
3 、程序寫入數據時,要順便將當前的會話 ID(SessionID) 寫入表中。
4 、程序讀取數據時,只讀取與當前會話 ID 相同的記錄即可。
功能增強的擴展設計:
1 、可以在數據表上建立一個視圖,視圖對記錄的篩選條件就是當前會話的SessionID 。
2 、數據表中的SessionID 列可以通過Trigger 實現,以實現對應用層的透明性。
3 、高級用戶可以訪問全局數據,以實現更加復雜的功能。
擴展臨時表的優點:
1 、實現了與Oracle 的基於會話的臨時表相同的功能。
2 、支持SDO_GEOMETRY 等lob 數據類型。
3 、支持表間的主外鍵連接,且主外鍵連接也是基於會話的。
4 、高級用戶可以訪問全局數據,以實現更加復雜的功能

F. Oracle臨時表創建的基本語句是什麼

Oracle創建臨時表的語法如下:
CREATE
GLOBAL
TEMPORARY
TABLE
table
"("
column
datatype
[DEFAULT
expr]
[{
NULL
|
NOT
NULL}]
[,
column
datatype
[DEFAULT
expr]
[
{NULL
|
NOT
NULL}
]...
")"
ON
COMMIT
{DELETE
|
PRESERVE
}
ROWS
;
在Oracle中,可以創建以下兩種臨時表:
1)
會話特有的臨時表
CREATE
GLOBAL
TEMPORARY
(
)
ON
COMMIT
PRESERVE
ROWS;
2)
事務特有的臨時表
CREATE
GLOBAL
TEMPORARY
(
)
ON
COMMIT
DELETE
ROWS;
CREATE
GLOBAL
TEMPORARY
TABLE
MyTempTable

G. 如何清空oracle資料庫中所有的臨時表

首先,需要知道臨時表都叫什麼名字或者有什麼特徵,比如都是以temp開頭的表是臨時表。

可用如下語句:

select'TRUNCATETABLE'||TABLE_NAME||';'fromtabswheretable_namelike'TEMP%';

此時,結果中會生成一組語句,復制粘貼。如圖:

將復制出來的語句,全選,並執行,即可。

H. oracle中的臨時表是用來做什麼的

某些情況下, 需要 多個非常大的表關聯的情況下, 但是需要檢索的, 是少量的數據的時候.

可以先把 大表的數據, 檢索出那一小部分, 然後插入到 臨時表中, 最後再關聯處理。

I. Oracle臨時表創建的基本語句是什麼

首先是創建臨時表的語法:
CREATE
GLOBAL
TEMPORARY
TABLE
table
"("
column
datatype
[DEFAULT
expr]
[{
NULL
|
NOT
NULL}]
[,
column
datatype
[DEFAULT
expr]
[
{NULL
|
NOT
NULL}
]...
")"
ON
COMMIT
{DELETE
|
PRESERVE
}
ROWS
;
在Oracle中,可以創建以下兩種臨時表:
1)
會話特有的臨時表
CREATE
GLOBAL
TEMPORARY
(
)
ON
COMMIT
PRESERVE
ROWS;
2)
事務特有的臨時表
CREATE
GLOBAL
TEMPORARY
(
)
ON
COMMIT
DELETE
ROWS;
CREATE
GLOBAL
TEMPORARY
TABLE
MyTempTable
所建的臨時表雖然是存在的,但是如果insert
一條記錄然後用別的連接登上去select,記錄是空的。
--ON
COMMIT
DELETE
ROWS
說明臨時表是事務指定,每次提交後ORACLE將截斷表(刪除全部行)
--ON
COMMIT
PRESERVE
ROWS
說明臨時表是會話指定,當中斷會話時ORACLE將截斷表。
Oracle中的臨時表有兩種一種是事務級別的臨時表它在事務結束的時候自動清空記錄,另一種是會話級的它在我們訪問資料庫是的一個會話結束後自動的清空。關於臨時表多用戶並行不是問題,一個會話從來不會阻止另一個會話使用臨時表。即使「鎖定」臨時表,一個會話也不會阻止其他會話使用它們的臨時表。
例子如:
會話級:
CREATE
GLOBAL
TEMPORARY
TABLE
rp_RETAIL017PROC(
ID
NUMBER(10)
not
null,
AD_CLIENT_ID
NUMBER(10),
AD_ORG_ID
NUMBER(10),
OWNERID
NUMBER(10),
MODIFIERID
NUMBER(10),
CREATIONDATE
VARCHAR2(8),
MODIFIEDDATE
DATE,
ISACTIVE
CHAR(1)
not
null,
AD_PI_ID
NUMBER(10),
BILLDATE
NUMBER(8),
DOCNO
VARCHAR2(80),
C_STORE_ID
NUMBER(10),
M_PRODUCT_ID
NUMBER(10),
M_PRODUCTALIAS_ID
NUMBER(10),
M_ATTRIBUTESETINSTANCE_ID
NUMBER(10),
TYPE
NUMBER(1),
QTY
NUMBER(10),
PRICEACTUAL
NUMBER(14,2),
ACOST
NUMBER,
PERCOST
NUMBER,
TOT_AMT_ACTUAL
NUMBER,
PRICEACOST
NUMBER,
TOT_AMT_COST
NUMBER,
PREGROSS
NUMBER,
PROFITCOST
NUMBER,
DESCRIPTION
VARCHAR2(765),
PRICELIST
NUMBER(14,2),
TOT_AMT_LIST
NUMBER(18,4))
ON
COMMIT
PRESERVE
ROWS;
事務級:
CREATE
GLOBAL
TEMPORARY
TABLE
rp_RETAIL017PROC(
ID
NUMBER(10)
not
null,
AD_CLIENT_ID
NUMBER(10),
AD_ORG_ID
NUMBER(10),
OWNERID
NUMBER(10),
MODIFIERID
NUMBER(10),
CREATIONDATE
VARCHAR2(8),
MODIFIEDDATE
DATE,
ISACTIVE
CHAR(1)
not
null,
AD_PI_ID
NUMBER(10),
BILLDATE
NUMBER(8),
DOCNO
VARCHAR2(80),
C_STORE_ID
NUMBER(10),
M_PRODUCT_ID
NUMBER(10),
M_PRODUCTALIAS_ID
NUMBER(10),
M_ATTRIBUTESETINSTANCE_ID
NUMBER(10),
TYPE
NUMBER(1),
QTY
NUMBER(10),
PRICEACTUAL
NUMBER(14,2),
ACOST
NUMBER,
PERCOST
NUMBER,
TOT_AMT_ACTUAL
NUMBER,
PRICEACOST
NUMBER,
TOT_AMT_COST
NUMBER,
PREGROSS
NUMBER,
PROFITCOST
NUMBER,
DESCRIPTION
VARCHAR2(765),
PRICELIST
NUMBER(14,2),
TOT_AMT_LIST
NUMBER(18,4))
ON
COMMIT
delete
ROWS;