臨時表空間包含的內容以及作用
- 中間排序的結果
- 臨時表和臨時索引
- 臨時LOBs
- 臨時B-trees
臨時表空間包含一些臨時數據,只是短暫使用,一般排序操作用到臨時表空間的時候比較多,還有就是創建臨時表的時候。數據庫啓動後默認會創建一個叫TEMP的臨時表空間,數據庫關閉後,臨時表空間的內容自動釋放掉,也可以使用create tablespace語句手動創建臨時表空間。一個臨時表空間可以由多個用戶共享使用。
使用以下語句可以修改數據庫的臨時表空間:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE tablespace_name;
以下語句可以查詢數據庫的默認表空間的名稱
SELECT PROPERTY_NAME, PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE
PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';
PROPERTY_NAME PROPERTY_VALUE
-------------------------- ------------------------------
DEFAULT_TEMP_TABLESPACE TEMP
V$SORT_SEGMENT 視圖查看臨時表空間排序段中分配和未分配的extents。 V$TEMPSEG_USAGE標識了這些extents是那些用戶使用的。如下一個查詢的實例:
SQL> select TABLESPACE_NAME,USED_EXTENTS,FREE_EXTENTS ,TOTAL_EXTENTS from V$SORT_SEGMENT;
TABLESPACE_NAME USED_EXTENTS FREE_EXTENTS TOTAL_EXTENTS
------------------------------- ------------ ------------ -------------
TEMP 3 35762 35765
SQL> desc V$TEMPSEG_USAGE
Name Null? Type
----------------------------------------- -------- ----------------------------
USERNAME VARCHAR2(30)
USER VARCHAR2(30)
SESSION_ADDR RAW(8)
SESSION_NUM NUMBER
SQLADDR RAW(8)
SQLHASH NUMBER
SQL_ID VARCHAR2(13)
TABLESPACE VARCHAR2(31)
CONTENTS VARCHAR2(9)
SEGTYPE VARCHAR2(9)
SEGFILE# NUMBER
SEGBLK# NUMBER
EXTENTS NUMBER
BLOCKS NUMBER
SEGRFNO# NUMBER
SQL> select username,user,extents from v$tempseg_usage;
USERNAME USER EXTENTS
------------------------------ ------------------------------ ----------
SYS SYS 1
SYS SYS 1
SYS SYS 1
當一個排序操作完成後,不會釋放這寫extents,而是標記爲free,然後給其他排序操作重用。可以查詢DBA_TEMP_FREE_SPACE看到總的分配的空間和空閒的空間。也可以手工收縮本地管理的臨時表空間。以下兩條命令是收縮表空間和臨時表空間數據文件的語句,keep選項指定的尺寸,如果省略不寫,則會收縮到最小。
ALTER TABLESPACE lmtemp1 SHRINK SPACE KEEP 20M;
ALTER TABLESPACE lmtemp2 SHRINK TEMPFILE '/u02/oracle/data/lmtemp02.dbf';
創建一個本地管理的臨時表空間
可以查詢 V$TEMPFILE and DBA_TEMP_FILES 視圖,查看臨時表空間的數據文件。
以下語句表示一個extent是16M(如果塊是2K,那麼就是8000個塊),大小爲20M的臨時表空間
CREATE TEMPORARY TABLESPACE lmtemp TEMPFILE '/u02/oracle/data/lmtemp01.dbf'
SIZE 20M REUSE
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 16M;
臨時表空間組
臨時表空間組介紹:
- 至少包含一個臨時表空間,組中最大包含的臨時表空間個數沒有限制
- 共享表空間的命名,所以不能和任何表空間的名字相同
- 在爲數據庫分配默認臨時表空間或爲用戶分配臨時表空間時,可以在任何位置指定表空間組名稱。
視圖DBA_TABLESPACE_GROUPS可以查看其相關信息。
如下示例,如果group1和group2都不存在,可以使用create語句創建通過tablespace group指定一個組,也可以通過alter tablespace語句指定一個組。
CREATE TEMPORARY TABLESPACE lmtemp2 TEMPFILE '/u02/oracle/data/lmtemp201.dbf'
SIZE 50M
TABLESPACE GROUP group1;
ALTER TABLESPACE lmtemp TABLESPACE GROUP group2;
可以通過以下語句添加臨時表空間到臨時表空間組,以下語句把Imtemp3添加到了group1中,結合上面的語句,group1中包含了lmtemp2和lmtemp3
CREATE TEMPORARY TABLESPACE lmtemp3 TEMPFILE '/u02/oracle/data/lmtemp301.dbf'
SIZE 25M
TABLESPACE GROUP group1;
Imtemp2從group1移到了group2
ALTER TABLESPACE lmtemp2 TABLESPACE GROUP group2;
現在group2包含了Imtemp和Imtemp2
從組中刪除臨時表空間
ALTER TABLESPACE lmtemp3 TABLESPACE GROUP '';
分配一個臨時表空間組爲默認的臨時表空間
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE group2;
如果指定了一個臨時表空間組爲數據庫默認的臨時表空間,那麼不能直接刪除臨時表空間組的成員,必須先從臨時表空間組移除纔可以。同樣,也不能刪除數據庫中默認的單個的臨時表空間。
創建臨時表
臨時表分爲session級和事物級,臨時表對所有session都可見,但是數據只對插入的session纔可見。
使用CREATE GLOBAL TEMPORARY TABLE語句創建一個臨時表。 ON COMMIT子句表示表中的數據是事務級(缺省值)還是會話級,其含義如下:
解釋:
DELETE ROWS 創建基於事務的臨時表。會每次提交後,數據庫都truncate表(刪除所有行)。
PRESERVE ROWS 創建一個基於session的臨時表,當session結束時,truncate表。
如下創建一個事物臨時表:
CREATE GLOBAL TEMPORARY TABLE admin_work_area
(startdate DATE,
enddate DATE,
class CHAR(20))
ON COMMIT DELETE ROWS;
也可以在臨時表上創建索引,和臨時表類型一致,可以基於事物和會話兩種。
默認情況下,臨時表中的行存儲在創建它的用戶的默認臨時表空間中。但是,創建臨時表後,可以使用CREATE GLOBAL TEMPORARY TABLE的TABLESPACE子句將臨時表分配給另一個表空間。可以使用此功能來節省臨時表使用的空間。這樣排序操作和臨時表就分開存放,避免不必要的衝突和性能影響。
如下:創建一個tbs_t1的臨時表空間,然後給臨時表admin_work_area使用
CREATE TEMPORARY TABLESPACE tbs_t1
TEMPFILE 'tbs_t1.f' SIZE 50m REUSE AUTOEXTEND ON
MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K;
CREATE GLOBAL TEMPORARY TABLE admin_work_area
(startdate DATE,
enddate DATE,
class CHAR(20))
ON COMMIT DELETE ROWS
TABLESPACE tbs_t1;