Oracle臨時表空間語句、作用


 在Oracle數據庫中;一個表空間只屬於一個數據庫使用;而一個數據庫可以擁有多個表空間。屬於"一對多"的關系

 我們對照着mysql來理解.

復制代碼
1、Oracle有表空間,mysql沒有表空間
2、Oracle提供的Sql Plus登錄
3、MySQL在一個實例中可以創建多個數據庫,但Oracle在一個實例中就只有一個數據庫,但是一個oracle一個數據庫對應多個實例,用實例sid來區分。
   請看我的一篇 https://www.cnblogs.com/aozhejin/p/15859979.html
4、mysql是先建實例,后建庫,oracle是先建庫,后建實例(看看下面的模型)
    mysql--->實例1---》a庫---》a1表
                             a1表
                      b庫--->b1表
                             b2表
    oracle---->數據庫a--->a實例--->a表空間----》a1表
                                             a2表
                                  b表空間---->b1表
                                             b2表
                                   b實例--->c表空間----》c1表
                                                       c2表
                                           d表空間---->d1表
                                                      d2表

下面主要的幾個表空間.

1)system表空間

每個Oracle數據庫都會有SYSTEM表空間,而且SYSTEM表空間總是要保持在聯機模式下,因為其包含了數據庫運行所要求的基本信息,
如:數據字典、聯機求助機制、所有回退段、臨時段、所有的用戶數據庫實體、其它ORACLE軟件產品要求的表等等。

2)SYSAUX表空間

作為SYSTEM表空間的輔助表空間,主要存放一些其他的 metadata 組件,如 OEM,Streams 等會默認存放在 SYSAUX 表空間里。

3)臨時表空間

臨時表空間是用來管理數據庫排序操作以及用於存儲臨時表、中間排序結果等臨時對象,當ORACLE里需要用到SORT的時候,
並且當PGA中sort_area_size大小不夠時,將會把數據放入臨時表空間里進行排序。像數據庫中一些操作:
 CREATE INDEX、 ANALYZE、SELECT DISTINCT、ORDER BY、GROUP BY、 UNION ALL、 INTERSECT、MINUS、SORT-MERGE JOINS、HASH JOIN
等都可能會用到臨時表空間。當操作完成后,系統會自動清理臨時表空間中的臨時對象,自動釋放臨時段。

4)UNDO表空間

undo表空間中會自動分配undo段,這些undo段用來保存事務中的DML語句的undo信息,也就是來保存數據在被修改之前的值。在rollback,實例恢復(前滾),
一致性讀CR塊的構造時會使用到undo信息。由於undo的引入,從而Oracle的select語句實現一致性讀時,不需要任何鎖。

5)USERS表空間

創建用戶必須為其指定表空間,如果沒有顯性指定默認表空間,則指定為users表空間,此用戶所有信息都會放入到users表空間中。

6)業務表空間(自建)

小結: 我們可以認為主要就是四個部分組成 一種是系統表空間、臨時表空間、日志表空間、業務表空間,這個應該沒有太多疑問。

 

由於臨時表空間是內存中的,所以我們通過pl/sql在查詢時候也看不到具體的表。

 

  一、臨時表空間作用一:

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

臨時表空間對應的文件就是臨時文件temp file,在Oracle中可以使用dba_temp_files視圖進行查詢。
SQL> col file_name for a50;

  SQL> select file_name, bytes/1024/1024, AUTOEXTENSIBLE from dba_temp_files;

   FILE_NAME     BYTES/1024/1024 AUTOEXTEN
   --------------- ---------
  /u01/oracle/oradata/prd/prd_temp01.dbf   10337 YES

  /u01/oracle/oradata/fp/fp_temp01.dbf  50 YES

  //這里兩個庫,分別指定了表空間

通常,在系統創建的時候,Oracle會創建臨時表空間Temp作為系統默認臨時表空間Temporary Tablespace。而且,通常Temp表空間都是設置為支持自動拓展的。

   二、 臨時表空間作用二:

  索引create或rebuild;
  Order by 或 group by;
  Distinct 操作;
  Union 或 intersect 或 minus;
  Sort-merge joins;
  analyze。
   表空間從類型上有若干分類的方式,一種是按照“文件file”的大小,區別為small file tablespace和big file tablespace。另一種是按照表空間用途而定的。
   此種分類方法可以將表空間划分為持久化表空間(Permanent Tablespace)、Undo表空間和臨時表空間(Temporary Tablespace)。
Temporary臨時表空間是oracle一種內部空間調控的產物。根據Oracle官方文檔中的介紹,Temporary表空間主要是針對session會話自身的操作使用的。
當一個會話通過SQL或者PL/SQL將數據集合獲取,進行大面積的sort或者group by操作時,會話會嚴重的消耗PGA資源。PGA是針對會話自身特有信息的一塊內存區域,
   用於保存會話自身特有、無法與其他會話共享的信息。如果數據集很大,這樣對內存PGA的資源消耗就會很大。Oracle在這個時候,就會采用類似操作系統虛擬內存技術的方法,
   從硬盤上借一塊空間給PGA置換使用,緩解PGA的不足。
在使用Temporary表空間的時候,是系統自動完成的臨時段segment對象創建和銷毀。這個過程對用戶會話而言是透明的。

三、關於臨時表空間的語句:

1、查詢TEMP表空間使用情況

  SQL> set pagesize 0
  SQL> set line 9999
 SQL> SELECT temp_used.tablespace_name,total - used AS "Free",
  total AS "Total",ROUND (NVL (total - used, 0) * 100 / total, 3) "Free percent"
  FROM ( SELECT tablespace_name, SUM (bytes_used) / 1024 / 1024 used
  FROM GV$TEMP_SPACE_HEADER GROUP BY tablespace_name) temp_used,
  (SELECT tablespace_name, SUM (bytes) / 1024 / 1024 total FROM dba_temp_files
   GROUP BY tablespace_name) temp_total 11 WHERE temp_used.tablespace_name = temp_total.tablespace_name;
   TEMP     0 10337 0
   FP_TEMP 49 50 98

2、更改系統的默認臨時表空間
 --查詢默認臨時表空間

   SQL> select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';
    DEFAULT_TEMP_TABLESPACE  TEMP   Name of default temporary tablespace

 --修改默認臨時表空間
alter database default temporary tablespace temp1;

3、改變臨時表空間大小   alter database tempfile /u01/oracle/oradata/fp/fp_temp01.dbf' resize 100M;

     alter database tempfile 4 autoextend on next 100M maxsize 1000M;

4、更改某一用戶的臨時表空間:
alter user scott temporary tablespace temp3;

3、擴展臨時表空間: 方法一、增大臨時文件大小:   SQL> alter database tempfile '/u01/oracle/oradata/fp/fp_temp01.dbf' resize 100m; 方法二、將臨時數據文件設為自動擴展:   SQL> alter database tempfile '/u01/oracle/oradata/fp/fp_temp01.dbf’ autoextend on next 5m maxsize unlimited; 方法三、向臨時表空間中添加數據文件:   SQL> alter tablespace temp add tempfile '/u01/oracle/oradata/fp/fp_temp01.dbf’ size 100m; 5、創建臨時表空間:   create temporary tablespace temp01 tempfile '/u01/oracle/oradata/fp/fp_temp01.dbf' size 10M; 6、更改系統的默認臨時表空間: 查詢默認臨時表空間   select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE'; 修改默認臨時表空間   alter database default temporary tablespace temp02;   select username,temporary_tablespace,default_tablespace from dba_users;
   更改某一用戶的臨時表空間:
  alter user scott temporary tablespace temp02;

7、刪除臨時表空間
  刪除臨時表空間的一個數據文件:
  alter database tempfile 'C:ORADATAORCLTEMP03.DBF' drop;
  刪除臨時表空間(徹底刪除):
  drop tablespace temp including contents and datafiles cascade constraints;

8、查看臨時表空間的使用情況(GV_$TEMP_SPACE_HEADER視圖必須在sys用戶下才能查詢)
   GV_$TEMP_SPACE_HEADER視圖記錄了臨時表空間的使用大小與未使用的大小
   dba_temp_files視圖的bytes字段記錄的是臨時表空間的總大小
  SELECT temp_used.tablespace_name,      
  total - used as "Free",
  total as "Total",
  round(nvl(total - used, 0) * 100 / total, 3) "Free percent"
  FROM (SELECT tablespace_name, SUM(bytes_used) / 1024 / 1024 used
  FROM GV_$TEMP_SPACE_HEADER
  GROUP BY tablespace_name) temp_used,
  (SELECT tablespace_name, SUM(bytes) / 1024 / 1024 total
  FROM dba_temp_files
  GROUP BY tablespace_name) temp_total
  WHERE temp_used.tablespace_name = temp_total.tablespace_name

 89、查找消耗資源比較的sql語句
  Select se.username,
  se.sid,
  su.extents,
  su.blocks * to_number(rtrim(p.value)) as Space,
  tablespace,
  segtype,
  sql_text
  from v$sort_usage su, v$parameter p, v$session se, v$sql s
  where p.name = 'db_block_size'
  and su.session_addr = se.saddr
  and s.hash_value = su.sqlhash
  and s.address = su.sqladdr
  order by se.username, se.sid

 10、查看當前臨時表空間使用大小與正在占用臨時表空間的sql語句
  select sess.SID, segtype, blocks * 8 / 1000 "MB", sql_text
  from v$sort_usage sort, v$session sess, v$sql sql
  where sort.SESSION_ADDR = sess.SADDR
  and sql.ADDRESS = sess.SQL_ADDRESS
  order by blocks desc;

 11、臨時表空間組介紹
 1)創建臨時表空間組:
  create temporary tablespace tempts1 tempfile '/u01/oracle/oradata/fp/fp_temp01.dbf' size 2M tablespace group group1;
  create temporary tablespace tempts2 tempfile '/u01/oracle/oradata/fp/fp_temp01.dbf' size 2M tablespace group group2;

 2)查詢臨時表空間組:dba_tablespace_groups視圖
  select * from dba_tablespace_groups;
  GROUP_NAME TABLESPACE_NAME
------------------------------ ------------------------------
  GROUP1 TEMPTS1
  GROUP2 TEMPTS2

 3)將表空間從一個臨時表空間組移動到另外一個臨時表空間組:
  alter tablespace tempts1 tablespace group GROUP2 ;
  select * from dba_tablespace_groups;

  GROUP_NAME TABLESPACE_NAME
------------------------------ ------------------------------
  GROUP2 TEMPTS1
  GROUP2 TEMPTS2

 4)把臨時表空間組指定給用戶
  alter user scott temporary tablespace GROUP2;

 5)在數據庫級設置臨時表空間
  alter database default temporary tablespace GROUP2;

  alter database orcl default temporary tablespace GROUP2;

 6)刪除臨時表空間組 (刪除組成臨時表空間組的所有臨時表空間)
  drop tablespace tempts1 including contents and datafiles;
  select * from dba_tablespace_groups;
  GROUP_NAME TABLESPACE_NAME
------------------------------ ------------------------------
  GROUP2 TEMPTS2

  drop tablespace tempts2 including contents and datafiles;
  select * from dba_tablespace_groups;
  GROUP_NAME TABLESPACE_NAME

 12、對臨時表空間進行shrink(11g新增的功能)
  將temp表空間收縮為20M
  alter tablespace temp02 shrink space keep 20M;
 自動將表空間的臨時文件縮小到最小可能的大小
  ALTER TABLESPACE temp SHRINK TEMPFILE ’/u01/oracle/oradata/fp/fp_temp01.dbf’;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM