[转]oracle临时表相关知识
生活随笔
收集整理的這篇文章主要介紹了
[转]oracle临时表相关知识
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
回復: 臨時表存放在哪兒?
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 during a session or instance failure
??
undo logs for the data and redo logs for the undo logs??前者不是放在rollback segment中嗎?怎么能寫到redo log中去呢?
復: 臨時表存放在哪兒?
臨時表對insert/select型的應用很有用。
比如在處理web翻頁時,可以通過臨時表來模擬cache返回結果。
相應的,
如果是update/select or delete select型的應用使用臨時表是不占多少優勢的。
??
應為雖然其不直接寫redo,但會通過undo間接寫redo。
而insert的undo其實是用空白塊回寫,幾乎不寫redo。
相應的update/delete需要對相關db block做cp undo的操作(特別是delete),對應的redo開銷也多多了。
回復: 如何在整個session中鎖定某個表?-----------------------------7d335b34f403eaContent-Disposition
在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工具導入導出表的
定義,但是不能導出數據。表的定義對所有的會話可見。
Temporary Tables臨時表
1簡介
?? ORACLE數據庫除了可以保存永久表外,還可以建立臨時表temporary tables。這些臨時表用來保存一個會話SESSION的數據,
?? 或者保存在一個事務中需要的數據。當會話退出或者用戶提交commit和回滾rollback事務的時候,臨時表的數據自動清空,
?? 但是臨時表的結構以及元數據還存儲在用戶的數據字典中。
?? 臨時表只在oracle8i以及以上產品中支持。
2詳細介紹
?? Oracle臨時表分為 會話級臨時表 和 事務級臨時表。
會話級臨時表是指臨時表中的數據只在會話生命周期之中存在,當用戶退出會話結束的時候,Oracle自動清除臨時表中數據。
事務級臨時表是指臨時表中的數據只在事務生命周期中存在。當一個事務結束(commit or rollback),Oracle自動清除臨時表中數據。
臨時表中的數據只對當前Session有效,每個Session都有自己的臨時數據,并且不能訪問其它Session的臨時表中的數據。因此,
臨時表不需要DML鎖.當一個會話結束(用戶正常退出 用戶不正常退出 ORACLE實例崩潰)或者一個事務結束的時候,Oracle對這個會話的
表執行 TRUNCATE 語句清空臨時表數據.但不會清空其它會話臨時表中的數據.
你可以索引臨時表和在臨時表基礎上建立視圖.同樣,建立在臨時表上的索引也是臨時的,也是只對當前會話或者事務有效.??
臨時表可以擁有觸發器.
3建立臨時表
?? 臨時表的定義對所有會話SESSION都是可見的,但是表中的數據只對當前的會話或者事務有效.
?? 建立方法:
1) ON COMMIT DELETE ROWS 定義了建立事務級臨時表的方法.
CREATE GLOBAL TEMPORARY TABLE admin_work_area
????????(startdate DATE,
???????? enddate DATE,
???????? class CHAR(20))
??????ON COMMIT DELETE ROWS;
EXAMPLE:
SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area
??2??????????(startdate DATE,
??3?????????? enddate DATE,
??4?????????? class CHAR(20))
??5????????ON COMMIT DELETE ROWS;
SQL> create table permernate( a number);
SQL> insert into admin_work_area values(sysdate,sysdate,'temperary table');
SQL> insert into permernate values(1);
SQL> commit;
SQL> select * from admin_work_area;
SQL> select??* from permernate;
A
1
2)ON COMMIT PRESERVE ROWS 定義了創建會話級臨時表的方法.
CREATE GLOBAL TEMPORARY TABLE admin_work_area
????????(startdate DATE,
???????? enddate DATE,
???????? class CHAR(20))
???? ON COMMIT PRESERVE ROWS;
EXAMPLE:
會話1:
SQL> drop table admin_work_area;
SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area
??2??????????(startdate DATE,
??3?????????? enddate DATE,
??4?????????? class CHAR(20))
??5?????? ON COMMIT PRESERVE ROWS;
SQL> insert into permernate values(2);
SQL> insert into admin_work_area values(sysdate,sysdate,'session temperary');
SQL> commit;
SQL> select * from permernate;
???????? A
----------
???????? 1
???????? 2
SQL> select * from admin_work_area;
STARTDATE??ENDDATE????CLASS
---------- ---------- --------------------
17-1?? -03 17-1?? -03 session temperary
會話2:
SQL> select * from permernate;
???????? A
----------
???????? 1
???????? 2
SQL> select * from admin_work_area;
未選擇行.
會話2看不見會話1中臨時表的數據.
4 ORACLE臨時表和SQLSERVER臨時表異同
SQL SERVER臨時表
也可以創建臨時表。臨時表與永久表相似,但臨時表存儲在 tempdb 中,當不再使用時會自動刪除。
有本地和全局兩種類型的臨時表,二者在名稱、可見性和可用性上均不相同。本地臨時表的名稱以單個數字符號 (#) 打頭;
它們僅對當前的用戶連接是可見的;當用戶從 Microsoft? SQL Server? 2000 實例斷開連接時被刪除。全局臨時表的名稱以數學符號
(##) 打頭,創建后對任何用戶都是可見的,當所有引用該表的用戶從 SQL Server 斷開連接時被刪除。
例如,如果創建名為 employees 的表,則任何人只要在數據庫中有使用該表的安全權限就可以使用該表,除非它已刪除。
如果創建名為 #employees 的本地臨時表,只有您能對該表執行操作且在斷開連接時該表刪除。如果創建名為 ##employees 的全局臨時表
,數據表中的任何用戶均可對該表執行操作。如果該表在您創建后沒有其他用戶使用,則當您斷開連接時該表刪除。如果該表在您創建
后有其他用戶使用,則 SQL Server在所有用戶斷開連接后刪除該表
不同:
1.????????SQL SERVER臨時表是一種”內存表”,表是存儲在內存中的.ORACLE臨時表除非執行DROP TABLE,否則表定義會保留在數據字典中.
2.????????SQL SERVER臨時表不存在類似ORACLE臨時表 事務級別 上的功能.
3????????SQL SERVER本地臨時表(#) 與 ORACLE的會話級別臨時表類似,但是在會話退出的時候,ORACLE不會刪除表.
4????????SQL SERVER的全局臨時表(##) 是指多個連接共享同一片內存.當沒有指針引用該內存區域時,SQL SERVER自動釋放全局臨時表.
5????????由于ORACLE不是一種 內存中的數據庫. 所以如果ORACLE類似SQL SERVER 頻繁的對臨時表進行建立和刪除,必定會影響性能.
所以ORACLE會保留臨時表的定義直到用戶DROP TABLE.
6????????在ORACLE中,如果需要多個用戶共享一個表(類似SQL SERVER的全局臨時表##).則可以利用永久表,
并且在表中添加一些可以唯一標識用戶的列.利用觸發器和視圖.當用戶退出的時候,根據該登陸用戶的唯一信息刪除相應的表中的數據.
這種方法給ORACLE帶來了一定量的負載.
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 during a session or instance failure
??
undo logs for the data and redo logs for the undo logs??前者不是放在rollback segment中嗎?怎么能寫到redo log中去呢?
復: 臨時表存放在哪兒?
臨時表對insert/select型的應用很有用。
比如在處理web翻頁時,可以通過臨時表來模擬cache返回結果。
相應的,
如果是update/select or delete select型的應用使用臨時表是不占多少優勢的。
??
應為雖然其不直接寫redo,但會通過undo間接寫redo。
而insert的undo其實是用空白塊回寫,幾乎不寫redo。
相應的update/delete需要對相關db block做cp undo的操作(特別是delete),對應的redo開銷也多多了。
回復: 如何在整個session中鎖定某個表?-----------------------------7d335b34f403eaContent-Disposition
在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工具導入導出表的
定義,但是不能導出數據。表的定義對所有的會話可見。
Temporary Tables臨時表
1簡介
?? ORACLE數據庫除了可以保存永久表外,還可以建立臨時表temporary tables。這些臨時表用來保存一個會話SESSION的數據,
?? 或者保存在一個事務中需要的數據。當會話退出或者用戶提交commit和回滾rollback事務的時候,臨時表的數據自動清空,
?? 但是臨時表的結構以及元數據還存儲在用戶的數據字典中。
?? 臨時表只在oracle8i以及以上產品中支持。
2詳細介紹
?? Oracle臨時表分為 會話級臨時表 和 事務級臨時表。
會話級臨時表是指臨時表中的數據只在會話生命周期之中存在,當用戶退出會話結束的時候,Oracle自動清除臨時表中數據。
事務級臨時表是指臨時表中的數據只在事務生命周期中存在。當一個事務結束(commit or rollback),Oracle自動清除臨時表中數據。
臨時表中的數據只對當前Session有效,每個Session都有自己的臨時數據,并且不能訪問其它Session的臨時表中的數據。因此,
臨時表不需要DML鎖.當一個會話結束(用戶正常退出 用戶不正常退出 ORACLE實例崩潰)或者一個事務結束的時候,Oracle對這個會話的
表執行 TRUNCATE 語句清空臨時表數據.但不會清空其它會話臨時表中的數據.
你可以索引臨時表和在臨時表基礎上建立視圖.同樣,建立在臨時表上的索引也是臨時的,也是只對當前會話或者事務有效.??
臨時表可以擁有觸發器.
3建立臨時表
?? 臨時表的定義對所有會話SESSION都是可見的,但是表中的數據只對當前的會話或者事務有效.
?? 建立方法:
1) ON COMMIT DELETE ROWS 定義了建立事務級臨時表的方法.
CREATE GLOBAL TEMPORARY TABLE admin_work_area
????????(startdate DATE,
???????? enddate DATE,
???????? class CHAR(20))
??????ON COMMIT DELETE ROWS;
EXAMPLE:
SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area
??2??????????(startdate DATE,
??3?????????? enddate DATE,
??4?????????? class CHAR(20))
??5????????ON COMMIT DELETE ROWS;
SQL> create table permernate( a number);
SQL> insert into admin_work_area values(sysdate,sysdate,'temperary table');
SQL> insert into permernate values(1);
SQL> commit;
SQL> select * from admin_work_area;
SQL> select??* from permernate;
A
1
2)ON COMMIT PRESERVE ROWS 定義了創建會話級臨時表的方法.
CREATE GLOBAL TEMPORARY TABLE admin_work_area
????????(startdate DATE,
???????? enddate DATE,
???????? class CHAR(20))
???? ON COMMIT PRESERVE ROWS;
EXAMPLE:
會話1:
SQL> drop table admin_work_area;
SQL> CREATE GLOBAL TEMPORARY TABLE admin_work_area
??2??????????(startdate DATE,
??3?????????? enddate DATE,
??4?????????? class CHAR(20))
??5?????? ON COMMIT PRESERVE ROWS;
SQL> insert into permernate values(2);
SQL> insert into admin_work_area values(sysdate,sysdate,'session temperary');
SQL> commit;
SQL> select * from permernate;
???????? A
----------
???????? 1
???????? 2
SQL> select * from admin_work_area;
STARTDATE??ENDDATE????CLASS
---------- ---------- --------------------
17-1?? -03 17-1?? -03 session temperary
會話2:
SQL> select * from permernate;
???????? A
----------
???????? 1
???????? 2
SQL> select * from admin_work_area;
未選擇行.
會話2看不見會話1中臨時表的數據.
4 ORACLE臨時表和SQLSERVER臨時表異同
SQL SERVER臨時表
也可以創建臨時表。臨時表與永久表相似,但臨時表存儲在 tempdb 中,當不再使用時會自動刪除。
有本地和全局兩種類型的臨時表,二者在名稱、可見性和可用性上均不相同。本地臨時表的名稱以單個數字符號 (#) 打頭;
它們僅對當前的用戶連接是可見的;當用戶從 Microsoft? SQL Server? 2000 實例斷開連接時被刪除。全局臨時表的名稱以數學符號
(##) 打頭,創建后對任何用戶都是可見的,當所有引用該表的用戶從 SQL Server 斷開連接時被刪除。
例如,如果創建名為 employees 的表,則任何人只要在數據庫中有使用該表的安全權限就可以使用該表,除非它已刪除。
如果創建名為 #employees 的本地臨時表,只有您能對該表執行操作且在斷開連接時該表刪除。如果創建名為 ##employees 的全局臨時表
,數據表中的任何用戶均可對該表執行操作。如果該表在您創建后沒有其他用戶使用,則當您斷開連接時該表刪除。如果該表在您創建
后有其他用戶使用,則 SQL Server在所有用戶斷開連接后刪除該表
不同:
1.????????SQL SERVER臨時表是一種”內存表”,表是存儲在內存中的.ORACLE臨時表除非執行DROP TABLE,否則表定義會保留在數據字典中.
2.????????SQL SERVER臨時表不存在類似ORACLE臨時表 事務級別 上的功能.
3????????SQL SERVER本地臨時表(#) 與 ORACLE的會話級別臨時表類似,但是在會話退出的時候,ORACLE不會刪除表.
4????????SQL SERVER的全局臨時表(##) 是指多個連接共享同一片內存.當沒有指針引用該內存區域時,SQL SERVER自動釋放全局臨時表.
5????????由于ORACLE不是一種 內存中的數據庫. 所以如果ORACLE類似SQL SERVER 頻繁的對臨時表進行建立和刪除,必定會影響性能.
所以ORACLE會保留臨時表的定義直到用戶DROP TABLE.
6????????在ORACLE中,如果需要多個用戶共享一個表(類似SQL SERVER的全局臨時表##).則可以利用永久表,
并且在表中添加一些可以唯一標識用戶的列.利用觸發器和視圖.當用戶退出的時候,根據該登陸用戶的唯一信息刪除相應的表中的數據.
這種方法給ORACLE帶來了一定量的負載.
轉載于:https://www.cnblogs.com/liguiqing/archive/2008/03/21/1116126.html
總結
以上是生活随笔為你收集整理的[转]oracle临时表相关知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html对象属性大全
- 下一篇: JavaScript 读取、写入Txt文