oracle 臨時表空間和數據表空間
Oracle臨時表空間主要用來作查詢和存放一些緩衝區數據。臨時表空間消耗的主要緣由是須要對查詢的中間結果進行排序。重啓數據庫能夠釋放臨時表空間,若是不能重啓實例,而一直保持問題sql語句的執行,temp表空間會一直增加。直到耗盡硬盤空間。網上有人猜想在磁盤空間的分配上,oracle使用的是貪心算法,若是上次磁盤空間消耗達到1GB,那麼臨時表空間就是1GB。也就是說當前臨時表空間文件的大小是歷史上使用臨時表空間最大的大小。臨時表空間的主要做用:算法
索引create或rebuild
Order by 或 group by
Distinct 操做
Union 或 intersect 或 minus
Sort-merge joins
analyze
數據表空間:表空間的做用能幫助DBA用戶完成如下工做:sql
決定數據庫實體的空間分配;
設置數據庫用戶的空間份額;
控制數據庫部分數據的可用性;
分佈數據於不一樣的設備之間以改善性能;
備份和恢復數據。
用戶建立其數據庫實體時其必須於給定的表空間中具備相應的權力,因此對一個用戶來講,其要操縱一個ORACLE數據庫中的數據,應該:數據庫
被授予關於一個或多個表空間中的RESOURCE特權;
被指定缺省表空間;
被分配指定表空間的存儲空間使用份額;
被指定缺省臨時段表空間。
表空間的維護是由ORACLE數據庫系統管理員DBA經過SQL*PLUS語句實現的,其中表空間建立與修改中的文件名是不能帶路徑的,所以DBA必須在ORACLE/DBS目錄中操做。oracle
-- 表空間相關問題函數
--建立永久表空間
create tablespace tablespace_name
datafile 'PATH_OF_NEW_DATAFILE'
size 50M
AUTOEXTEND ON NEXT 50M;性能
--刪除表空間
DROP TABLESPACE TABLESPACE_NAME;ui
-- 表空間不足的通常報錯信息爲:
-- sqlexception:ora-01654: unable to extend index index_name by 1024 in tablespace tablespace_namespa
-- 表空間是邏輯概念,數據文件和臨時數據文件都是物理感念。
-- 一個表空間能夠有多個數據文件或者臨時數據文件。
SELECT * FROM dba_tablespaces;
SELECT * FROM dba_data_files;排序
-- 該表中只有數據文件的使用率,不包含臨時數據文件
SELECT * FROM dba_free_space;索引
-- dba_data_files表中同一個tablespace_name可能會有多個數據文件
-- 使用sum彙集函數,而且添加group by子句能夠統計相同的tablesapce_name的多個數據文件的總大小
select t.tablespace_name, round(sum(d.bytes/(1024*1024)),0) "tablespace_size(M)"
from dba_tablespaces t, dba_data_files d
where t.tablespace_name = d.tablespace_name
group by t.tablespace_name;
select sum(bytes)/(1024*1024) as free_space,tablespace_name
from dba_free_space
group by tablespace_name;
-- 查詢數據文件實際使用狀況(不包含臨時數據文件,執行速度比較慢)
select file_name, sum(e.bytes)/1024/1024 as mb
from dba_extents e join dba_data_files f on e.file_id=f.file_id
group by file_name;
-- 爲某個表空間添加數據文件,文件路徑格式參考dba_data_files表中的格式
alter tablespace tablespace_name add datafile 'PATH_OF_NEW_DATAFILE' size 10m
autoextend ON next 5m maxsize 100m;
-- 修改已有的數據文件自動增加
alter database datafile 'PATH_OF_OLD_DATAFILE'
autoextend on next 5m maxsize 100m;
-- 從新設置已有的數據文件大小,若是是縮小的話不能小於數據文件的實際使用狀況
alter database datafile 'PATH_OF_OLD_DATAFILE'
resize 100m;
-- 如何解決臨時表空間不足
SELECT * FROM dba_temp_files;
-- 查詢臨時表空間的使用狀況,D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)表明左聯接
SELECT D.TABLESPACE_NAME,SPACE "SUM_SPACE(M)",BLOCKS SUM_BLOCKS,
USED_SPACE "USED_SPACE(M)",ROUND(NVL(USED_SPACE,0)/SPACE100,2) "USED_RATE(%)",
NVL(FREE_SPACE,0) "FREE_SPACE(M)"
FROM
(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(10241024),2) SPACE,SUM(BLOCKS) BLOCKS
FROM DBA_TEMP_FILES
GROUP BY TABLESPACE_NAME) D,
(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES_USED)/(10241024),2) USED_SPACE,
ROUND(SUM(BYTES_FREE)/(10241024),2) FREE_SPACE
FROM V$TEMP_SPACE_HEADER
GROUP BY TABLESPACE_NAME) F
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+);
-- 創建一箇中轉臨時表空間:
create temporary tablespace temp2
tempfile 'PATH_OF_NEW_TEMPFILE' size 512M
reuse autoextend on next 100M maxsize 2048M;
alter database default temporary tablespace temp2;
drop tablespace temp including contents and datafiles;
create temporary tablespace temp
tempfile 'PATH_OF_NEW_TEMPFILE' size 512M
reuse autoextend on next 100M maxsize 1024M;
alter database default temporary tablespace temp;
drop tablespace temp2 including contents and datafiles;
-- 查看分配給某個表的空間,無論實際是否使用
SELECT TABLESPACE_NAME,TO_CHAR(SUM(BYTES)/(1024*1024),'999G999D999') CNT_MB
FROM DBA_EXTENTS
WHERE OWNER='SCOTT' AND SEGMENT_NAME='BONUS' AND SEGMENT_TYPE LIKE '%TABLE%'
GROUP BY TABLESPACE_NAME;
-- 實際使用的空間 analyze table SCOTT.BONUS compute statistics; select num_rows * avg_row_len from dba_tables where owner = 'SCOTT' and table_name = 'BONUS';