ORACLE Temporary Tables臨時表更適合做插入和查詢操作
ORACLE資料庫除了可以儲存永久表外,還可以建立臨時表temporary tables。這些臨時表用來儲存一個會話SESSION的資料,或者儲存在一個事務中需要的資料。當會話退出或者使用者提交commit和回滾rollback事務的時候,臨時表的資料自動清空(truncate),但是臨時表的結構以及後設資料還儲存在使用者的資料字典中。
1簡介
ORACLE資料庫除了可以儲存永久表外,還可以建立臨時表temporary tables。這些臨時表用來儲存一個會話SESSION的資料,或者儲存在一個事務中需要的資料。當會話退出或者使用者提交commit和回滾rollback事務的時候,臨時表的資料自動清空(truncate),但是臨時表的結構以及後設資料還儲存在使用者的資料字典中。
In addition to permanent tables, Oracle can create temporary tables to hold session-private data that exists only for the duration of a transaction or session.
Temporary tables are supported by Oracle9i and Oracle8i.
2詳細介紹
Oracle臨時表分為 會話級臨時表 和 事務級臨時表。
會話級臨時表是指臨時表中的資料只在會話生命週期之中存在,當使用者退出會話結束的時候,Oracle自動清除臨時表中資料。
事務級臨時表是指臨時表中的資料只在事務生命週期中存在。當一個事務結束(commit or rollback),Oracle自動清除臨時表中資料。
臨時表中的資料只對當前Session有效,每個Session都有自己的臨時資料,並且不能訪問其它Session的臨時表中的資料。因此,臨時表不需要DML鎖。
The CREATE GLOBAL TEMPORARY TABLE statement creates a temporary table that can be transaction-specific or session-specific. For transaction-specific temporary tables, data exists for the duration of the transaction. For session-specific temporary tables, data exists for the duration of the session. Data in a temporary table is private to the session. Each session can only see and modify its own data. 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.
DML操作的臨時表不產生redo log重作日誌,但會產生回滾日誌Undo log;Undo的產生(rollback segment)會產生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.
當一個會話結束(使用者正常退出 使用者不正常退出 ORACLE例項崩潰)或者一個事務結束的時候,Oracle對這個會話的表執行 TRUNCATE 語句清空臨時表資料.但不會清空其它會話臨時表中的資料.
A TRUNCATE statement issued on a session-specific temporary table truncates data in its own session. It does not truncate the data of other sessions that are using the same table.
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.
你可以索引臨時表和在臨時表基礎上建立檢視.同樣,建立在臨時表上的索引也是臨時的,也是隻對當前會話或者事務有效. 臨時表可以擁有觸發器.
You can create indexes for temporary tables using the CREATE INDEX statement. Indexes created on temporary tables are also temporary, and the data in the index has the same session or transaction scope as the data in the temporary table.
You can create views that access both temporary and permanent tables. You can also create triggers on temporary tables.
空間分配Segment Allocation(v$sort_usage)
Temporary tables use temporary segments. Unlike permanent tables, temporary tables and their indexes do not automatically allocate a segment when they are created. Instead, segments are allocated when the first INSERT (or CREATE TABLE AS SELECT) is performed. This means that if a SELECT, UPDATE, or DELETE is performed before the first INSERT, then the table appears to be empty.
Temporary segments are deallocated at the end of the transaction for transaction-specific temporary tables and at the end of the session for session-specific temporary tables.
臨時表在一些版本中存在BUG可能產生過多的REDO LOG。eygle 的站點
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中臨時表的資料.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8570952/viewspace-207199/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle Temporary Tables(Oracle 臨時表)Oracle
- Oracle臨時表GLOBAL TEMPORARY TABLEOracle
- 臨時表空間temporary tablespace相關操作
- oracle的臨時表空間temporary tablespaceOracle
- Oracle臨時表 優化查詢速度Oracle優化
- 【TEMPORARY TABLE】Oracle臨時表使用注意事項Oracle
- Oracle臨時表最佳化查詢速度Oracle
- Oracle臨時表 最佳化查詢速度Oracle
- Oracle下查詢臨時表空間佔用率Oracle
- 全域性臨時表 GLOBAL TEMPORARY TABLE
- 記憶體(memory)表和臨時(temporary)表之瞭解記憶體
- oracle 表空間,臨時表空間使用率查詢Oracle
- ORACLE臨時表和SQLSERVER臨時表異同OracleSQLServer
- oracle 臨時表空間基本常識和操作Oracle
- [ORACLE BUG]查詢結果錯誤--臨時表並行Oracle並行
- Oracle10新特性:臨時表空間組(temporary tablespace group)Oracle
- Oracle中用子查詢建立臨時表 並賦值資料Oracle賦值
- oracle11g 查詢臨時表空間的使用率和正在使用臨時表空間的使用者Oracle
- Oracle 查詢佔用臨時表空間大的歷史會話和SQLOracle會話SQL
- Oracle10g新特性:臨時表空間組(temporary tablespace group)Oracle
- Allocation of Temporary Segments for Temporary Tables and Indexes (28)Index
- 臨時表空間和回滾表空間使用率查詢
- 查詢oracle 表的大小和表的建立時間Oracle
- 臨時表的操作
- Oracle 基礎 ----臨時表和物件表Oracle物件
- 插入查詢資料的操作
- 臨時表的APPEND方式插入APP
- oracle臨時表Oracle
- Oracle 臨時表Oracle
- Oracle 12CR2查詢轉換之cursor-duration臨時表Oracle
- oracle 查詢什麼sql佔用臨時段OracleSQL
- oracle global temporary table全域性臨時表_測試及v$tempseg_usageOracle
- mysqPoint型別查詢和插入操作:insert和select型別
- Restrictions on Altering Temporary TablesREST
- 50個查詢系列-建表和插入資料
- 臨時表空間被佔滿的原因查詢
- PHP專案中如何用PDO查詢臨時表?PHP
- orace global temporary table全域性臨時表測試小記