Oracle臨時表空間和臨時表介紹

臨時表空間包含的內容以及作用
  1. 中間排序的結果
  2. 臨時表和臨時索引
  3. 臨時LOBs
  4. 臨時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;
臨時表空間組

臨時表空間組介紹:

  1. 至少包含一個臨時表空間,組中最大包含的臨時表空間個數沒有限制
  2. 共享表空間的命名,所以不能和任何表空間的名字相同
  3. 在爲數據庫分配默認臨時表空間或爲用戶分配臨時表空間時,可以在任何位置指定表空間組名稱。

視圖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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章