在網上搜索了不少次oracle表空間查詢語句,如今記錄下來html
SELECT * FROM ( SELECT D.TABLESPACE_NAME, SPACE || 'M' "SUM_SPACE(M)", BLOCKS "SUM_BLOCKS", SPACE - NVL (FREE_SPACE, 0) || 'M' "USED_SPACE(M)", ROUND ( (1 - NVL (FREE_SPACE, 0) / SPACE) * 100, 2) || '%' "USED_RATE(%)", FREE_SPACE || 'M' "FREE_SPACE(M)" FROM ( SELECT TABLESPACE_NAME, ROUND (SUM (BYTES) / (1024 * 1024), 2) SPACE, SUM (BLOCKS) BLOCKS FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) D, ( SELECT TABLESPACE_NAME, ROUND (SUM (BYTES) / (1024 * 1024), 2) FREE_SPACE FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+) UNION ALL SELECT D.TABLESPACE_NAME, SPACE || 'M' "SUM_SPACE(M)", BLOCKS SUM_BLOCKS, USED_SPACE || 'M' "USED_SPACE(M)", ROUND (NVL (USED_SPACE, 0) / SPACE * 100, 2) || '%' "USED_RATE(%)", NVL (FREE_SPACE, 0) || 'M' "FREE_SPACE(M)" FROM ( SELECT TABLESPACE_NAME, ROUND (SUM (BYTES) / (1024 * 1024), 2) SPACE, SUM (BLOCKS) BLOCKS FROM DBA_TEMP_FILES GROUP BY TABLESPACE_NAME) D, ( SELECT TABLESPACE_NAME, ROUND (SUM (BYTES_USED) / (1024 * 1024), 2) USED_SPACE, ROUND (SUM (BYTES_FREE) / (1024 * 1024), 2) FREE_SPACE FROM V$TEMP_SPACE_HEADER GROUP BY TABLESPACE_NAME) F WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+) ORDER BY 1)
其中包含了當前的表空間和臨時表空間總空間大小和當前使用狀況,忽然看到其中包含臨時表空間語句,產生了一些興趣,度了一番以後,以下:sql
建立臨時表空間,比起普通表空間多了temporary關鍵字數據庫
create temporary tablespace x_temp tempfile 'F:\app\Admin\oradata\orcl\temp_x.dbf' size 10m autoextend on next 10m maxsize 2048m extent management local
查詢臨時表空間使用狀況時,若是臨時表空間是dictionary managed temporary tablespace,可使用下面SQL:session
SELECT (S.TOT_USED_BLOCKS/F.TOTAL_BLOCKS)*100 AS "PERCENT USED" FROM (SELECT SUM(USED_BLOCKS) TOT_USED_BLOCKS FROM V$SORT_SEGMENT WHERE TABLESPACE_NAME='TEMP' ) S, (SELECT SUM(BLOCKS) TOTAL_BLOCKS FROM DBA_DATA_FILES WHERE TABLESPACE_NAME='TEMP' ) F;
若是臨時表空間是Locally Manageed Temporary Tablespace,可使用下面SQL:oracle
SELECT T.TABLESPACE_NAME, ( U.TOT_USED_BLOCKS / T.TOTAL_BLOCKS ) * 100 AS "PERCENT USED" FROM (SELECT TABLESPACE_NAME, SUM(USED_BLOCKS) TOT_USED_BLOCKS FROM V$SORT_SEGMENT WHERE TABLESPACE_NAME = 'TEMP' GROUP BY TABLESPACE_NAME) U, (SELECT TABLESPACE_NAME, SUM(BLOCKS) TOTAL_BLOCKS FROM DBA_TEMP_FILES WHERE TABLESPACE_NAME = 'TEMP' GROUP BY TABLESPACE_NAME) T;
也可使用以下SQL:app
SELECT D.tablespace_name, SPACE "SUM_SPACE(M)", blocks "SUM_BLOCKS", used_space "USED_SPACE(M)", Round(Nvl(used_space, 0) / SPACE * 100, 2) "USED_RATE(%)", SPACE - used_space "FREE_SPACE(M)" FROM (SELECT tablespace_name, Round(SUM(bytes) / (1024 * 1024), 2) SPACE, SUM(blocks) BLOCKS FROM dba_temp_files GROUP BY tablespace_name) D, (SELECT tablespace, Round(SUM(blocks * 8192) / (1024 * 1024), 2) USED_SPACE FROM v$sort_usage GROUP BY tablespace) F WHERE D.tablespace_name = F.tablespace(+)
在最開始查詢臨時表空間的臨時表部分sql語句是記錄了temp文件在某一時刻使用過的最大大小,視圖v$temp_space_header顯示的是每個temp文件在某一個時刻使用過的最大大小,從本質上說,它顯示的是每個tempfile的初始化大小,而不是實際分配的塊大小,而v$sort_usage中能夠看到臨時表空間的當前使用狀況性能
臨時表空間主要用來作查詢和存放一些緩衝區數據。臨時表空間消耗的主要緣由是須要對查詢的中間結果進行排序,進行導入導出expdp/impdp等,當臨時表空間滿了以後,根據查找的內容,有如下處理方式spa
一、重啓數據庫會釋放部分臨時表空間,不太適用於生產環境code
二、增長臨時表空間數據文件大小htm
alter tablespace temp add tempfile '/data/prod/proddata/temp013.dbf' size 8G
三、重建臨時表空間
create temporary tablespace TEMPA TEMPFILE 'F:/app/Admin/oradata/orcl/temp02.dbf ' SIZE 8192M REUSE AUTOEXTEND ON NEXT 1024K MAXSIZE UNLIMITED; alter database default temporary tablespace tempa; drop tablespace temp including contents and datafiles;
當tempa表空間滿了以後亦能夠切換回temp表空間
create temporary tablespace TEMP TEMPFILE 'F:/app/Admin/oradata/orcl/temp01.dbf ' SIZE 8192M REUSE AUTOEXTEND ON NEXT 1024K MAXSIZE UNLIMITED; alter database default temporary tablespace temp; drop tablespace tempa including contents and datafiles;
這樣實現默認臨時表空間切換,臨時表空間組這些後面再考慮,通常要求drop的臨時表空間最好不存在活動的排序操做,若刪除過程當中出現卡住的現象,能夠用如下查詢語句查出進程,驗證影響後,可將進程殺掉
Select se.username, se.sid, se.serial#, 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;
alter system kill session '66,6666; (假如某一條運行的sql語句的SID爲66,serial#爲6666)
四、收縮臨時表空間
alter tablespace temp shrink space keep 4G
KEEP 選項用來指定壓縮時表空間或者數據文件shrink的最小值,若是沒有執行該命令,那麼表空間或數據文件將被壓縮到最小值。以下
alter tablespace temp shrink space
TEMP表空間被壓縮到最小,Temp 表空間太小對性能是有影響的,因此在shrink時,仍是建議使用keep 指定最小值
SELECT * FROM DBA_TEMP_FREE_SPACE;
該語句也能夠查看臨時表空間使用狀況