개념..(네이버에 어떤분이 이해하기 쉽게 써놨길래 퍼왔습니다..)

테이블스페이스는 데이터베이스의 물리적 스키마(테이블,인덱스)를 생성하기 위한 공간입니다. 
테이블스페이스가 생성되기 위해서는 당연히 데이터베이스가 정의되어야 하고요...
이러한 테이블스페이스가 필요로 하는 물리적 디스크 공간이 데이터파일입니다.
테이블스페이스와 데이터파일의 관계는 당연히 1:N 의 관계이고요...
당연히 테이블스페이스가 처음 생성이 될때는 데이터파일이 지정되어야 합니다.
오라클 데이터베이스같은 경우에는, 오라클 데몬 (DBWR인가...)이 다음의 프로세스를 거쳐 테이블스페이스를 생성합니다.

 1. 테이블스페이스 생성 구문 및 파라미터를 분석한다.

2. 데이터파일 경로가 파일 시스템상에 존재하는 올바른 경로인지 확인한다.

3. 데이터파일을 지정된 파일 시스템에 생성한다.

4. 파일시스템이 생성되면 테이블스페이스를 데이터 사전에 등록하고 생성한다.

테이블스페이스가 생성되면, 그 테이블스페이스를 사용할 유저를 생성합니다.
유저의 생성 구문은
create user "사용자명" identified by "암호"
default tablespace "테이블스페이스명"
temporary tablespace "임시테이블스페이스명";
입니다. 당연히 테이블스페이스가 지정이 되어 있어야 유저를 생성할 수 있습니다
(기본 테이블스페이스는 기본적으로 "시스템"테이블 스페이스입니다)

한가지 예를 들어 설명드리겠습니다.

예를 들어 "홍길동" 이 농사를 짓습니다.
농사를 지으려면 "땅"이 필요합니다.
"땅"을 구획을 지어 구별할 수 있는 이름으로 나누기 위해서는,
나라에서 지정하는 주소의 규칙을 따라서 "행정구역"으로 구분합니다.
"홍길동"이 농사를 짓기 위해 토지를 매입하려고 합니다.
나라에서는 "홍길동"이 사려는 땅이 누구의 소유인지 확인하고,
없으면 "번지"를 매겨 구획을 짓습니다.
그리고 "홍길동"은 해당 "번지" 에 대한 "등기부등본"을 받고 농사를 짓습니다.
그 다음부터는 "홍길동"은 마음대로 자신의 "농장"안에서
"콩"도 심고, "고추"도 심고, "참외"도 심습니다.
"농장"이 모자라게 되면, 추가로 "번지"를 매입하여 "농장"에 편입합니다. 
당연히 "등기부등본"에는 해당 "번지"가 "홍길동"의 "농장"임을 표시합니다.
 

"땅"은 데이터베이스,
"농장"은 테이블스페이스,
"행정구역"은 데이터파일이 들어갈 파일 시스템,
"번지"는 데이터파일,
"등기부등본"은 데이터사전,
"홍길동"은 유저,
"콩밭","고추밭","참외밭"은 테이블 개념으로 이해하시면 되겠습니다.
그럼 인덱스는요?
"콩밭"이나,"고추밭"이나,"참외밭"에서
"완두콩", "풋고추", "개구리참외"를 쉽게 찾기 위한 인식자입니다.
"고랑, 줄" 정도가 인덱스에 해당한다고 보면 되겠군요...
"완두콩은 첫번째 고랑부터 세번째 고랑까지 심었다" 면 말이죠...

----------------------------------------------------------------------------
테이블스페이스의 용량을 알아보는 쿼리문
SELECT
"Check Time"
,TS_INFO.tablespace_name
,TS_INFO."TOTAL SIZE(MB)"
,TS_INFO."USED(MB)"
,TS_INFO."AVAIL(MB)" "Tot_AVAIL(MB)"
,TO_CHAR((MAX(DFS.BYTES)/1024/1024),'999,990.999') "Act_AVAIL(MB)"  -- max Extent size on The tablespace
,TS_INFO."USED %"
,TS_INFO."FREE %"
,TS_INFO."STATUS"
FROM (
SELECT
SYSDATE "Check Time"
,tablespace_name
,sum(total_size)/1024 "TOTAL SIZE(MB)"
,TO_CHAR(round((sum(used)/1024),4),'999,990.999') "USED(MB)"
,TO_CHAR((sum(total_size)/1024)-(round((sum(used)/1024),4)),'999,990.999') "AVAIL(MB)"
,TO_CHAR(round((sum(used)/sum(total_size)),4)*100,'990.99') "USED %"
,TO_CHAR(round(1-(sum(used)/sum(total_size)),4)*100,'909.99') "FREE %"
,CASE WHEN  (round(1-(sum(used)/sum(total_size)),4)*100) <= '10' THEN ' Alert        ☜'
      WHEN  (round(1-(sum(used)/sum(total_size)),4)*100) <= '15' THEN ' Warning   ☜'
      WHEN  (round(1-(sum(used)/sum(total_size)),4)*100) <= '30' THEN ' Normal     △'
      ELSE ' Good        ◎' END "STATUS"
FROM (
SELECT
                  b.tablespace_name , -- tablespace Name
                  b.bytes / 1024 total_size, -- 총 Bytes
                  ((b.bytes - sum(nvl(a.bytes,0)))) / 1024 used, -- 사용한 용량
                  (sum(nvl(a.bytes,0))) / 1024 free_size -- 남은 용량
                  FROM DBA_FREE_SPACE a, DBA_DATA_FILES b
WHERE a.file_id(+) = b.file_id
and
b.tablespace_name in (select tablespace_name from dba_tablespaces)
                  GROUP BY b.tablespace_name, b.file_name, b.bytes

)
GROUP BY tablespace_name
) TS_INFO,
DBA_FREE_SPACE DFS

WHERE TS_INFO.TABLESPACE_NAME = DFS.TABLESPACE_NAME
GROUP BY TS_INFO.tablespace_name,"TOTAL SIZE(MB)","USED(MB)","AVAIL(MB)","USED %","FREE %","STATUS","Check Time"
ORDER BY "FREE %"; 

 
<데이타 파일별 용량 확인 쿼리> 

SELECT            SYSDATE "Check Time",
                  b.file_name "FILE_NAME", -- DataFile Name
                  b.tablespace_name "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
-- and b.tablespace_name = UPPER('&TS_name') -- 테이블 스페이스별로 보고싶을때 주석지우고 사용
                  GROUP BY b.tablespace_name, b.file_name, b.bytes
ORDER BY b.tablespace_name;
-----------------------------------------------------------------------
1. 해당 데이터파일의 크기를 재조정
ALTER DATABASE DATAFILE 'D:\ORACLE\ORADATA\KIRIO1\A1_CLON\A1.DBF'
RESIZE 1100M;


2. 해당 테이블 스페이스에 새로운 데이터파일 추가
ALTER TABLESPACE DATA ADD DATAFILE 'd:\oracle\oradata\kirio1\data01.dbf'
SIZE 100M;


3. 해당 데이터파일에 AUTOEXTEND ON 설정
ALTER DATABASE DATAFILE 'D:\ORACLE\ORADATA\KIRIO1\A1_CLON\A1.DBF'
AUTOEXTEND ON;

'컴퓨터 > DB' 카테고리의 다른 글

오라클 오류메시지  (0) 2009.01.15
데이터베이스 스키마  (0) 2009.01.15
오라클 초보자를 위한 팁  (0) 2009.01.15
오라클 힌트  (0) 2009.01.14
오라클에서 not exists, not in, minus의 성능차이  (0) 2009.01.13
      
Posted by k_ben