ㅁ초기 size는 400k 공간, 필요시 다음번 400kb 증가하고 그 다음에는
size가 자동으로 증가하여 최대 10m 까지 사용할 수 있는 데이블스페이스 생성
------------------------------------------------------------------------
create tablespace tbs_02
datafile 'tbs_02.dat' size 400k
Autoextend on next 400k maxsize 10m;
select tablespace_name, file_name , bytes, blocks, status, autoextensible
from dba_data_files
where tablespace_name='TBS_02';
------------------------------------------------------------------------
ㅁ 전체 size 는 10mb 이고 공간이 더 필요할 경우 모든 extent 는 128kb로 증가
------------------------------------------------------------------------
create tablespace tbs_03
datafile 'c:\oradata\tbs_03.dbf' size 10m
extent management local
uniform size 128k;
------------------------------------------------------------------------
ㅁ 자동으로 segment 공간을 관리해주는 테이블 스페이스 생성 ==> 사용권장
------------------------------------------------------------------------
CREATE TABLESPACE auto_seg_ts
DATAFILE 'C:\ORADATA\auto_seg_ts.dbf' SIZE 1M
EXTENT MANAGEMENT LOCAL ----------> coalesce 작업필요없다.
SEGMENT SPACE MANAGEMENT AUTO ; ----------> latch 획득 필요 없다.
------------------------------------------------------------------------
ㅁ OMF 테이블 스페이스 생성
------------------------------------------------------------------------
select value from v$parameter where name='db_create_file_dest';
===> Data file 이 생성되는 목적지
alter system set db_create_file_dest='c:\oradata' scope=spfile;
===> Data file 이 생성되어지는 목적지 변경
SQL> shutdown immediate
SQL> startup
SQL> create tablespace omf_ts1;
===>'db_create_file_dest' 에 설정한 경로에 size가 무제한 자동으로 증가하는
100MB의 Data File이 랜덤한 이름으로 생성되어짐.
SQL> select file_name, tablespace_name, bytes, autoextensible
from dba_data_files
where tablespace_name='OMF_TS1';
SQL> create tablespace omf_ts2 datafile autoextend off; (100m차면 끝.. 자동증가 없음)
SQL> drop tablespace omf_ts1 including contents and datafiles;
====> 테이블스페이스 와 포함된 object그리고 os상 파일까지 모두 삭제
=================================
테이블스페이스 공간조회 스크립트
=================================
-------------------------------------------------------------------
accept v_tbsname prompt '테이블스페이스명: '
set verify off
select A.totbytes, A.totblocks, B.freebytes, B.freeblocks,
A.totbytes - B.freebytes "Usedbytes",
A.totblocks - B.freeblocks "Usedblocks"
from
(select tablespace_name,
sum(bytes) totbytes, sum(blocks) totblocks
from dba_data_files
where tablespace_name=upper('&v_tbsname')
group by tablespace_name
) A,
(select tablespace_name,
sum(bytes) freebytes, sum(blocks) freeblocks
from dba_free_space
where tablespace_name=upper('&v_tbsname')
group by tablespace_name
) B
where A.tablespace_name = B.tablespace_name
/
set verify on
------------------------------------------------------------------
=====================================
Tablespace 에 Datafile 추가
=====================================
=== 테이블 스페이스 생성 ===
SQL> create tablespace test1
datafile 'C:\oracle\oradata\ddba120\test1.dbf' size 1m
extent management local
segment space management auto;
=== 테이블 스페이스 남은 공간 보기 ===
select * from dba_free_space
where tablespace_name = 'TEST1';
==== 어느 블럭에 테이블이 쓰이나? ====
SELECT segment_name , extent_id, block_id, bytes, blocks
from dba_extents
where owner='SCOTT'
AND segment_name in ('EMP2','EMP3','EMP4','EMP5','EMP6','EMP7','EMP8');
[테이블스페이스 공간이 없을때 할 수 있는 작업]---------------------
[1방법] 데이타 파일을 추가 (권장)
alter tablespace test1
add datafile 'C:\oracle\oradata\ddba120\test11.dbf' size 1M;
[2방법] 용량을 늘린다.
alter database datafile
'C:\oracle\oradata\ddba120\test11.dbf' resize 2m;
--------------------------------------------------------------------------
===== 현재 segments를 사용중인 tablespace 검색해보자 =====
SELECT distinct tablespace_name from dba_segments;
--> 방금 생성한 test1 테이블 스페이스는 없다
--> 왜? 테이블이나 인덱스 같은 segments를 생성하지 않아서
select * from dba_tablespaces;
--> 테이블 스페이스가 모두 보여진다.
--------------------------------------------------------------
그럼~ 테이블 스페이스중에 object가 한개도 없는 것을 찾으려면
--------------------------------------------------------------
select tablespace_name
from dba_tablespaces
minus ================> 차집합
select distinct tablespace_name
from dba_segments;
=================================
Tablespace의 Online/Offline 설정
=================================
SQL> SELECT tablespace_name, status from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM ONLINE ---> 읽고 쓰기 가능 DML가능!
UNDOTBS1 ONLINE
==== 해당 테이블이 저장되는 테이블 스페이스 ====
SQL> select tablespace_name from dba_tables
where table_name ='DEPT' AND OWNER='SCOTT';
TABLESPACE_NAME
------------------------------
SYSTEM
===== 테이블스페이스 offline만들기 ======
SQL> create table scott.dept2
tablespace users
as
select * from scott.dept;
SQL> alter tablespace users offline;
SQL> select tablespace_name, status from dba_tablespaces; --> 상태조회
SQL> select * from scott.dept;
==> 실행 가능
SQL> select * from scott.dept2;
==> 실행 거부 왜? offline이니까
===== 테이블스페이스 read only 만들기 ======
SQL> alter tablespace users online;
SQL> alter tablespace users read only;
==> select만 되어진다.
===== 테이블스페이스 read write만들기 ======
SQL> alter tablespace users read write;
==> 다시 online으로 복귀
---> 해당 유저의 기본테이블 스페이스 보기
select default_tablespace
from dba_users
where username = 'SCOTT';
---> 기본 테이블스페이스 변경
alter user scott
default tablespace system;
(변경되어질 테이블스페이스)
=========================
데이타 파일 이동
=========================
Users Tablespace의 C:\oracle\oradata\ddba120\users01.dbf를
D:\로 이동시키고자 한다.
SQL> create table scott.kh
(name varchar2(20));
SQL> insert into scott.kh values('송파교육원');
SQL> alter tablespace users offline; --> offline으로 우선 만든다
SQL> alter tablespace users
rename datafile 'C:\oracle\oradata\ddba120\USERS01.DBF'
to 'D:\ORADATA2\USERS01.DBF';
---> 변경할 위치를 적어주죠~~!!!
SQL> alter tablespace users online;
SQL> select tablespace_name, status from dba_tablespaces;
--> online/offline 상태조회
SQL> select tablespace_name, file_name, status from dba_data_files
where tablespace_name='USERS' ;
--> 데이타파일 상태조회
------------------
USERS
D:\ORADATA2\USERS01.DBF
AVAILABLE
---------------------------------------------------
---- 다시 원상복귀 그러나 다른 밥법!!! 기대하시랏!!!----
---------------------------------------------------
SQL> SHUTDOWN IMMEDIATE
'D:\ORADATA2\USERS01.DBF' 있는 것을 잘라내서
'C:\oracle\oradata\ddba120\USERS01.DBF' 로 붙여넣기
SQL> startup mount
SQL> alter database
rename file 'D:\ORADATA2\USERS01.DBF'
to 'C:\oracle\oradata\ddba120\USERS01.DBF' ;
SQL> alter database open;
SQL> select tablespace_name, file_name, status from dba_data_files
where tablespace_name='USERS' ;
------------------
USERS
C:\ORACLE\ORADATA\DDBA120\USERS01.DBF
AVAILABLE
datafile 관리하기
1. Logical Database Structure
-Segement : data, index, rollback, temporary
-보통 Oracle block=db_block 는 OS block 의 2배가 적당
2. SYSTEM and Non-SYSTEM Tablespace
- SYSTEM Tablespace : data dictionary 정보, SYSTEM rollback segment
- Non-SYSTEM Tablespace : Rollback segments, Temporary segments, App' data, App' index
3. CREATE TABLESPACE
CREATE TABLESPACE tablespace
DATAFILE filespec [autoextend_clause]
[, filespec [autoextend_clause]]...
[MINIMUM EXTENT integer [K|M]]
[DEFAULT storage_clause]
[PERMANENT|TEMPOARY] -- default PERMANENT
[ONLINE|OFFLINE] -- default ONLINE
예) CREATE TABLESPACE app_data
DATAFILE '/DISK4/app01.dbf' SIZE 100M,
'/DISK5/app02.dbf' SIZE 100M
MINIMUM EXTENT 500K
DEFAULT STORAGE (INITIAL 500K NEXT 500K
MAXEXTENTS 500 PCTINCREASE 0) ;
* Storage Parameters
- INITIAL : first extent의 size를 정한다. 최소 size는 2blocks이다. (2 * DB_BLOCK_SIZE)
default는 5 bolcks (5 * DB_BLOCK_SIZE)
- NEXT : 다음 extent의 size를 정한다. 최소 size는 1block 이다.
default는 5 bolcks (5 * DB_BLOCK_SIZE)
- MINEXTENTS : segment가 생성되었을 때 할당된 extent의 갯수.
default는 1
- PCTINCREASE n : 다음에 extent가 생성될 때 이전 extent보다 n% 증가된 size (PCT: percent)
default는 50
- MAXEXTENTS : segment가 갖을 수 있는 extent의 최대 수
4. Temporary Tablespace
CREATE TABLESPACE sort
DATAFILE '/DISK2/sort01.dbf' SIZE 50M
MINIMUM EXTENT 1M
DEFAULT STORAGE (INITIAL 2M NEXT 2M
MAXEXTENTS 500 PCTINCREASE 0)
TEMPORARY ;
5. Tablespace의 size 설정 (data file을 추가하면서...)
ALTER TABLESPACE app_data
ADD DATAFILE
'/DISK5/app03.dbf' SIZE 200M ;
6. Data File이 꽉차면 자동으로 datafile을 증가하게 만드는 방법.
ALTER TABLESPACE app_data
ADD DATAFILE
'/DISK6/app04.dbf' SIZE 200M
AUTOEXTEND ON NEXT 10M
MAXSIZE 500M ;
* 3가지 방법이 있다.
1) CREATE DATABASE
2) CREATE TABLESPACE DATAFILE
3) ALTER TABLESPACE ADD DATAFILE
7. 기존에 존재하는 datafile의 size를 resize하는 방법
ALTER DATABASE DATAFILE
'/DISK5/app02.dbf' RESIZE 200M ;
8. Changing the Storage Settings
ALTER TABLESPACE app_data
MINIMUM EXTENT 2M ;
ALTER TABLESPACE app_data
DEFAULT STORAGE
(INITIAL 2M NEXT 2M
MAXEXTENTS 999) ;
9. Tablespace OFFLINE/ONLINE
- tablespace가 만들어지면 default가 ONLINE이다.
- OFFLINE이 되면 다른 user의 access가 불가능하다.
- SYSTEM tablespace는 OFFLINE이 불가!
- transaction이 끝나지 않은 tablespace는 OFFLINE 불가!
ALTER TABLESPACE tablespace
{ ONLINE | OFFLINE [NORMAL|TEMPORARY|IMMEDIATE] }
- Normal : checkpoint를 적용시키고 offline한다.
- Temporary : datafile 중에서 online datafile에만 checkpoint를 적용시키고 offline한다.
- Immediate : checkpoint 없이 offline한다.
예) ALTER TABLESPACE app_data OFFLINE ;
10. Moving Data File : ALTER TABLESPACE
- 반드시 offline 한 상태에서 한다.
- target data file이 반드시 존재해야 한다.
ALTER TABLESPACE app_data
RENAME DATAFILE '/DISK4/app01.dbf'
TO '/DISK5/app01.dbf' ;
11. Moving Data File : ALTER DATABASE
- 반드시 database가 mount 상태여야 한다.
- target data file이 반드시 존재해야 한다.
- shutdown하고 host상태에서 datafile을 제거해야 한다.
ALTER DATABASE RENAME FILE
'/DISK1/system01.dbf' TO '/DISK2/system01.dbf' ;
12. READ-ONLY Tablespace 상태
- 오직 select만 할 수 있다.
- CREATE는 안되고... DROP은 할 수 있다.
- user들이 data변경을 못하고, backup과 recovery가 쉽다.
ALTER TABLESPACE app_data
READ ONLY
ALTER TABLESPACE app_data
READ WRITE -- read only 상태를 다시 read write상태로 바꿔준다.
* 주의점!
- tablespace가 반드시 online상태여야 한다.
- active transaction이 허용되지 않아야 한다.
- tablespace가 active rollback segment를 갖고 있으면 안된다.
- online backup중엔 못한다.
13. DROP TABLESPACE
- file 삭제는 host에 나가서 삭제를 해야 한다.
DROP TABLESPACE app_data
INCLUDING CONTENTS AND DATAFILES;
* including contents를 안썼을 때, tablespace가 비워져 있어야만 drop이 된다.
including contents는 데이터가 들어 있어도 tablespace를 삭제하겠다는 뜻이다.
14. DBA_TABLESPACES : tablespace 정보를 갖고 있다.
- TABLESPACE_NAME, NEXT_EXTENT, MAX_EXTENTS, PCT_INCREASE, MIN_EXTLEN, STATUS, CONTENTS
SVRMGR> SELECT tablespace_name, initial_extent, next_extent,
2 max_extents, pct_increase, min_extlen
3 FROM dba_tablespaces ;
15. DBA_DATA_FILES : file에 관한 정보를 갖고 있다.
- FILE_NAME, TABLESPACE_NAME, BYTES, AUTOEXTENSIBLE, MAXBYTES, INCREMENT_BY
select file_name, tablespace_name, bytes,
autextensible, maxbytes, increment_by
FROM dba_data_files ;
16. Contol File 정보
- V$DATAFILE : ts#, name, file#, rfile#, status, enabled, bytes, create_bytes
- V$TABLESPACE : ts#, name
SVRMGR> SELECT d.file#, d.name, d.status, d.enabled,
2 d.bytes, d.create_bytes, t.name
3 FROM v$datafile d, v$tablespace t
4 WHERE t.ts#=d.ts# ;
17. Temp File Autoextend ON
- autoextend 설정 상태 확인
SQL > select * from dba_temp_files; -- temp tablespace
- autoextend on
SQL > alter database tempfile 'D:\ORACLE\ORADATA\URISVC\LBS_TEMP.ORA' autoextend on next 100M;
데이터파일을 이용해 핫스팟 찾아내기
select name, phyrds, phywrts from v$datafile a, v$filestat b where a.file#=b.file#
데이블스페이스에 공간할당해도 extent가 안될 때
select tablespace_name, sum(bytes), max(bytes) from dba_free_space group by tablespace_name;
데이터 파일 확인하는 법
테이블스페이스 정보
- dba_tablespaces
- v$tablespace
테이터 파일 정보
- dba_data_files
- v$datafile
임시 파일 정보
- dba_temp_files
- v$tempfile
-
select file_name, tablespace_name, bytes from dba_data_files;
테이블스페이스에 데이터파일 크기 키우기
alter database
datafile ‘/oradata2/RMTESTDB/tools/tools01.dbf’ resize 500M;
--------------------------------------------------------------------------------
[ Lab ]
--------------------------------------------------------------------------------
1. 현재의 Tablespace와 Data file들을 확인하십시오.
$ sqlplus system/manager
SQL> select * from dba_tablespaces ;
SQL> select file_name, tablespace_name, bytes
2 from dba_data_files ;
2. DATA01 tablespace의 size를 늘이기 위하여, datafile을 하나 더 추가하십시오.
SQL> alter tablespace data01
2 add datafile '$ORACLE_HOME/DATA/DISK6/data01b.dbf' size 500k ;
SQL> select file_name, tablespace_nmae, bytes
2 from dba_data_files ;
3. 문제2 에서 추가한 datafil의 size를 1M 로 resize 하십시오.
SQL> alter database datafile
2 '$ORACLE_HOME/DATA/DISK6/data01b.dbf'
3 resize 1M ;
SQL> select file_name, tablespace_name, bytes
2 from dba_data_files ;
4. 문제2 에서 추가한 datafile의 size가 자동적으로 extend 될 수 있도록 하십시오.
SQL> alter database datafile
2 '$ORACLE_HOME/DATA/DISK6/data01b.dbf'
3 autoextend on next 100k maxsize 2m ;
SQL> select file_name, tablespace_name, bytes, autoextensible
2 from dba_data_files ;
5. INDX01 tablespace의 datafile을 DISK6으로 옮기시오.
SQL> alter tablespace indx01 offline ;
SQL> select name, status from v$datafile ;
SQL> host
$ mv $ORACLE_HOME/DATA/DISK3/indx01.dbf $ORACLE_HOME/DATA/DISK6/indx01.dbf
$ exit
SQL> alter tablespace indx01 rename datafile
2 '$ORACLE_HOME/DATA/DISK3/indc01.dbf'
3 to
4 '$ORACLE_HOME/DATA/DISK6/indx01.dbf' ;
SQL> alter tablespace indx01 online ;
SQL> select name, status from v$datafile ;
6. RONLY Tablespace를 read only로 바꾸고, 추가적인 테이블을 생성해 보십시오. 무슨 일이 발생하며 이유는 무엇입니까?
SQL> create table t1(t1 number) tablespace ronly ;
SQL> alter tablespace ronly read only ;
SQL> select name, enabled, status from v$datafile ;
SQL> create table t2(t2 number) tablespace ronly ; ==> error 발생 확인!
7. RONLY Tablespace를 삭제하십시오.
SQL> drop tablespace ronly including contents ;
SQL> select * from v$tablespace ;
SQL> host
$ rm $ORACLE_HOME/DATA/DISK1/ronly.dbf
EX>
데이터 파일 추가
alter tablespace INDX1
add datafile '/oradata10/indx02.dbf'
size 2000M,
'/oradata10/indx03.dbf'
size 2000M,
'/oradata10/indx04.dbf'
size 2000M,
'/oradata10/indx05.dbf'
size 2000M;
alter tablespace H
add datafile ‘/oradata2/H2.dbf’
size 200M
alter tablespace I
add datafile ‘/oradata3/I2.dbf’
size 200M
alter tablespace J
add datafile ‘/oradata4/J2.dbf’
size 200M
alter tablespace K
add datafile ‘/oradata5/K2.dbf’
size 200M
alter tablespace L
add datafile ‘/oradata6/L2.dbf’
size 200M
alter tablespace M
add datafile ‘/oradata2/M2.dbf’
size 200M
alter tablespace N
add datafile ‘/oradata3/N2.dbf’
size 200M
alter tablespace O
add datafile ‘/oradata4/O2.dbf’
size 200M
alter tablespace P
add datafile ‘/oradata5/P2.dbf’
size 200M
alter tablespace Q
add datafile ‘/oradata6/Q2.dbf’
size 200M
TEMP TABLESPACE가 꽉 찾을 경우
/* 임시 테이블스페이스 TEMP9를 새로 만든다. */
CREATE TEMPORARY TABLESPACE TEMP9 TEMPFILE
'C:\ORACLE\ORADATA\JJUDB\TEMP09.DBF' SIZE 846M AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
EX)
alter user JJU_POS temporary tablespace TEMP9;
select 'alter user '|| username||' temporary tablespace temp9;' from all_users;
/* 다음으로 기본 임시 테이블스페이스를 새로 만든걸로 바꿉니다. */
alter database default temporary tablespace temp9;
drop tablespace temp including contents ;
--Oracle 9i 이상부터는 기본적으로 System tablespace는 LOCAL이다
--9i 이전은 DICTIONARY 이었다.
만일 기존 temp가 돌고 있는 경우...
오라클 내렸다 MOUNT 상태에서 DROP 하고 데이타베이스 OPEN한다.
SQL> startup mount
ORACLE 인스턴스가 시작되었습니다.
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
데이터베이스가 마운트되었습니다.
SQL> alter database datafile 'C:\ORACLE\ORADATA\JJUDB\DATA\BSC_D.DBF' offline d
op ;
데이타베이스가 변경되었습니다.
SQL> drop tablespace bsc_i_ts ;
drop tablespace bsc_i_ts
*
1행에 오류:
ORA-01109: 데이터베이스가 개방되지 않습니다
SQL> alter database open ;
데이타베이스가 변경되었습니다.
default temporary tablespace 변경하기
No. 12096
(9I) DEFAULT TEMPORARY TABLESPACE의 개념과 사용 예제
===================================================
PURPOSE
-------
Space Management와 관련된 Oracle 9i의 새로운 기능 중 Default
Temporary Tablespace에 대하여 알아보기로 한다.
Explanation
-----------
데이터베이스 user를 생성할 때, 명시적으로 Temporary Tablespace를 지정하
지 않으면 기본적으로 SYSTEM 테이블스페이스가 할당되고, 모든 temporary
data는 이 SYSTEM 테이블스페이스에 저장된다. 9i에서는 데이터베이스 전체
에 걸쳐 사용될 Default Temporary Tablespace로 임의의 Temporary
Tablespace를 정의할 수 있다.
만일 별도의 Temporary Tablespace를 생성하고, 이를 Default Temporary
Tablespace로 지정하면 Temporary data를 저장할 공간으로 불필요하게
SYSTEM 테이블스페이스를 사용할 이유가 없게 된다. (데이터베이스 생성 시
정의할 수 있다.)
데이터베이스 운영 중 아래와 같이 동적으로 변경할 수 있으며, 이 경우 기
존 사용자의 Default Temporary Tablespace도 함께 변경이 된다.
SQL> ALTER DATABASE ora9i DEFAULT TEMPORARY TABLESPACE dts2;
Temporary type으로 만든 datafile은 dba_temp_files view를 보면 된다.
Restrictions on Default Temporary Tablespace
--------------------------------------------
새로운 Default Temporary Tablespace가 가용하기 전에 기존 Default
Temporary Tablespace를 drop할 수 없다.
Default Temporary Tablespace를 Permanent Tablespace로 변경할 수 없다.
Default Temporary Tablespace는 SYSTEM Tablespace이거나 Temporary Type
Tablespace이어야만 한다.
Default Temporary Tablespace는 OFFLINE으로 변경될 수 없다.
Example
-------
As SYSTEM
- 원래대로 Default Temporary Tablespace를 SYSTEM으로 복원
SQL> alter database ora9i default temporary tablespace system;
- 데이터베이스 user 생성 시 Temporary Tablespace 확인:SYSTEM tablespace
사용
SQL> create user omf_test identified by omf_test;
SQL> select username, temporary_tablespace from dba_users where
username = 'OMF_TEST'
USERNAME TEMPORARY_TABLESPACE
------------------------------ ----------------------------------------
OMF_TEST SYSTEM
- Default Temporary Tablespace를 TEMP tablespace(temporary type)로
변경 :
기존 사용자(OMF_TEST)의 Temporary Tablespace가 SYSTEM에서 TEMP로 변경
됨을 알 수 있다.
SQL> alter database ora9i default temporary tablespace temp;
SQL> select username, temporary_tablespace from dba_users where
username = 'OMF_TEST'
USERNAME TEMPORARY_TABLESPACE
------------------------------ ----------------------------------------
OMF_TEST TEMP
- 이제는 데이터베이스 user를 생성할 때, Temporary Tablespace가 SYSTEM이
아닌 TEMP가 됨을 확인
SQL> drop user omf_test;
SQL> create user omf_test identified by omf_test;
SQL> select username, temporary_tablespace from dba_users where
username = 'OMF_TEST'
USERNAME TEMPORARY_TABLESPACE
------------------------------ ----------------------------------------
OMF_TEST TEMP
SQL> drop user omf_test;
Reference Documents
-------------------
<Note:138212.1>
<데이타 파일별 용량 확인 쿼리>
SELECT SYSDATE "Check Time",
b.file_name "FILE_NAME",
b.tablespace_name "TABLESPACE_NAME",
TO_CHAR((b.bytes / 1024),'999,990,999') "TOTAL SIZE(KB)", -- 총 Bytes
TO_CHAR((((b.bytes - sum(nvl(a.bytes,0)))) / 1024),'999,990,999') "USED(KB)",
TO_CHAR(((sum(nvl(a.bytes,0))) / 1024),'999,990,999') "FREE SIZE(KB)",
TRUNC(((sum(nvl(a.bytes,0)) / (b.bytes)) * 100),2) "FREE %"
FROM DBA_FREE_SPACE a, DBA_DATA_FILES b
WHERE a.file_id(+) = b.file_id
GROUP BY b.tablespace_name, b.file_name, b.bytes
ORDER BY b.tablespace_name;