◎ 오라클 설치 환경

OS : CentOS6.9 x64 (정확힌 Yum update 를 해서 6.10 final 이다. 6.9도 된건 확인함) Oracle : 11gR2

◎ 오라클 설치방법

1. Oracle 설치에 필요한 rpm 패키지 설치(없으면 깐다)

아래 명령을 복붙해서 설치

yum -y install setarch make glibc libaio compat-libstdc++-33 compat-gcc-34 gcc libXp openmotif compat-db glibc-devel libstdc++-devel xscreensaver binutils compat-libcap1 gcc-c++ libaio libaio-devel sysstat

2. Oracle 설치 위한 환경 설정

# vi /etc/sysctl.conf   //아래값보다 큰 경우에만 적용

# add parameter ##################################################### fs.aio-max-nr = 1048576 fs.file-max = 6815744 #kernel.shmall = 2097152 ## 원래 있던 값이 더 커서 주석 처리 #kernel.shmmax = 536870912 ## 원래 있던 값이 더 커서 주석 처리 kernel.shmmni = 4096 # semaphores: semmsl, semmns, semopm, semmni ######################## kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default=4194304 net.core.rmem_max=4194304 net.core.wmem_default=262144 net.core.wmem_max=1048586

# /sbin/sysctl -p // 상위 설정 변경값 반영(필수) 아래와같이 뜰꺼임 (확인용도)

net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key error: "net.bridge.bridge-nf-call-iptables" is an unknown key error: "net.bridge.bridge-nf-call-arptables" is an unknown key kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 4194304 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048586

3. JAVA 설치 (Root 계정 사용 7,8버전 추천)

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

(자바파일 설치 링크)

Aceept 체크 후 linux x86 ,64 자기의 OS의 맞춰서 Tar 로 다운 ( 저는 tar가 편해서 이렇게함)

# gunzip jdk-8-linux-i586.tar.gz # tar -xvf jdk-8-linux-i586.tar

그후 압축을 압축을 풀면 jdk1.8.0_211 폴더가 생겼을 거임 그 폴더를 원하는 경로에 넣어주고 JAVA 폴더로 심볼릭 링크를 생성하면됨. 전 /usr/ 에 옮기고 JAVA 심볼릭 링크를 만듬

# mv jdk1.8.0_211 /usr/ # cd /usr # ln -s jdk1.8.0_211 java

위와 같이 명령어를 치면 아래 처럼 구조가 되있을거임

P.S 심볼릭 링크를 만드는 이유는 여러가지가 있겠지만 나중에 JDK 버전이 업데이트 됬을 시 환경 설정을 변경하지 않고 심볼릭 링크의 내용만 수정해 주면 된답니다.

이제 설치된 JAVA 파일을 계정에 등록해줘야 사용할수 있어서 등록해줌.

# vi /etc/profile //아래 구문을 복붙 해도 됨 #javapath JAVA_HOME=/usr/java CLASSPATH=.:$JAVA_HOME/lib/tools.jar PATH=$PATH:$JAVA_HOME/bin export JAVA_HOME CLASSPATH PATH

그리고 리눅스에 기본적으로 설정된 java 명령어 위치의 인식을 피하기 위해 /usr/bin 디렉토리의 java 파일 이름을 바꿔줍시다. 그 후 source 명령어를 사용해 /etc/profile의 내용을 현제 쉘에 적용시킵니다. 그리고 java, javac 명령어로 버전을 확인해서 설치된 버전이 출력되면 제대로 설치 된겁니다.

# mv /usr/bin/java /usr/bin/java-old # source /etc/profile # java -version # javac -version

이렇게하면 자바 설치는 완료됬습니다. 오라클설치파일은 자바로 돌아가서 자바를 설치해야 설치가 가능합니다.

4. Oracle 관리자 계정 생성 (필수)

- 그룹 생성 # groupadd oinstall # groupadd dba - 계정 생성 # useradd -g oinstall -G dba -d /home/oracle oracle - 패스워드 설정 # passwd oracle - 패스워드 정책 변경 # pwconv - 그룹 및 계정 확인 # vi /etc/group oinstall:x:501: dba:x:502:oracle # vi /etc/passwd oracle:x:501:501::/home/oracle:/bin/bash

5. Oracle 계정 Profile 수정 ( oracle 계정 사용 , 필수)

# su - oracle $ vi /home/oracle/.bash_profile // 아래와 같이 입력 ## 아래는 11g 설정 export ORACLE_HOME=/oracle export ORACLE_HOME=$ORACLE_HOME/product/11gr2 export ORACLE_SID=INFRAORA export PATH=$PATH:$ORACLE_HOME/bin # export NLS_LANG=AMERICAN_AMERICA.KO16KSC5601 // oracle 계정이 클라이언트로 언어문제 발생시 # export NLS_LANG=AMERICAN_AMERICA.KO16MSWIN949 // 에만 세팅 수정.. 설치시 아예 빼자!!

6. Oracle 11gr2 Release 2 다운로드 및 압축 풀기(Root 계정 사용, 필수)

▼ 오라클 홈페이지 11gR2 설치링크

https://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

리눅스 버전에 맞는 파일을 설치하면 되겠습니다.

이렇게 아무 폴더나 다운받으시고 2 파일의 압축을 풀어주시면 database 라는 폴더가 생길겁니다.

# unzip linux.x64_11gR2_database_1of2.zip # unzip linux.x64_11gR2_database_2of2.zip //압축이 다풀리면 원하는 경로에 database 를 가져다 놓으면 됩니다. 전 /oracle 에 옮겨놨습니다. # mv database /oracle/

7. 압축 푼 파일 database 폴더 oracle:oracle 권한 부여 (Root 계정 사용 , 필수)

# chown -R oracle.oinstall /oracle/database

8. 화면 권한 부여 (Root 계정 사용 , 필수)

# xhost + //만약 여기서 에러가 나면 터미널을 껏다가 다시 한번 시도해보시기 바랍니다. //그 이후도 안되면 에러 문구 구글 검색 하셔야 합니다 XHOST 화면권한이 안먹히는겁니다.

9. oracle 계정 선택 (필수)

- oracle 계정 사용 # su - oracle. - 한글 깨짐 방지(필요시) $ export LANG=C

10. runInstaller 실행(Oracle 계정 사용, 필수)

- 실행 $ cd /usr/local/src/database $ ./runInstaller






















11. 이메일 설정

- 이메일 설정 체크박스 해제/메시지 박스 나오면 OK.


12. 설치 옵션 선택

- Database 생성 및 구성 선택.



13. Desktop vs. Server Class 선택

- Server Class 선택.



14. DB 운영 선택

- 단독 인스턴스 DB 선택.



15. Typical vs. Advanced install 선택

- Advanced install 선택.



16. 언어 선택

- Korean 추가.



17. 에디션 선택

- Standard Edition 선택.



18. $ORACLE_HOME, $ORACLE_BASE 확인

- .bash_profile과 동일한지 확인.



19. 인벤토리 설정

- /oracle/oraInventory로 경로 설정.

- oinstall로 그룹 설정.

- 메시지 박스에서 Yes 선택.



20. 데이터베이스 타입 선택

- General Purpose / Transaction Processing 선택.



21. DB명 및 SID 설정

- 다른 인스턴스 추가가 아니라면 동일하게 입력.



22. 메모리 설정

- Enable Automatic Memory Management 체크.


23. 문자셋 선택

- KO16WIN949 선택.



24. 보안 설정

- Assert all new security settings 체크.



25. Oracle Enterprise Manager 11g Grid Control 선택

- 그냥 다음으로 PASS.



26. File Storage 선택

- File System 선택.

- /oradata 입력.



27. 자동 백업 선택

- Do not enable automated backups 선택.



28. 계정 암호 설정

- Use the same password for all accounts 선택 후 암호 입력.



29. SYSDBA, SYSOPER 그룹 선택

- 둘다 dba로 선택.



30. 설치 요구사항 체크

- 패키지가 상위버전이 깔린 경우 Failed가 뜨는 건지도...

- pdksh은 직접 받아서 깔아야 한다고도...

(http://rpm.pbone.net/index.php3/stat/4/idpl/2398776/com/pdksh-5.2.14-8.i386.rpm.html)

※ 이후 진행은 시키는 대로...


◎ 오라클 원격(외부) 접속 허용

▼ 내용

보통 linux (CentOS 6.9) 설치하면 방화벽은 따로 안막혀있다. 그런데 오라클 설치하고 원격으로 접속하려 하면 자꾸 접속이 안되있다. 리스너도 start 했고 db도 startup 했는데 원격으로 접속이 안된다면.

Port 번호가 막혀있는거다. 그래서 port번호를 열어줘야한다.

lsnrctl start //리눅스의 oracle 계정으로 실행 startup // "sqlplus / as sysdba" --db 접속후 start up //이렇게 하고도 원격으로 접속이 안된다면 방화벽 확인 후 방화벽도 정상이라면 iptables -I INPUT 1 -p tcp --dport 1521 -j ACCEPT //1521 PORT를 열어준다


◎ ORACLE 다른계정 권한주기

▼ 내용

ONE 계정의 테이블을 TWO계정에 권한을 줄려면 ONE계정으로 접속을 해서 쿼리를 날려야한다.권한을 SELECT,UPDATE,DELETE,INSERT 각각 줄수 있다.

GRANT INSERT ON [테이블이름] TO [계정이름]; GRANT DELETE ON [테이블이름] TO [계정이름]; GRANT UPDATE ON [테이블이름] TO [계정이름]; GRANT SELECT, INSERT, DELETE, UPDATE ON [테이블이름] TO [계정이름] ; //ONE계정에 USER 테이블을 TWO계정에도 권한을 주려면 아래와같이 쿼리를 날리면된다. GRANT SELECT USER TO TWO; GRANT INSERT USER TO TWO; GRANT DELETE USER TO TWO; GRANT UPDATE USER TO TWO; GRANT INSERT, DELETE, UPDATE,SELECT USER TO TWO; //TWO 계정에서 테이블 조회를 할때는 아래처럼 날려야한다 SELECT * FROM ONE.USER

◎ 오라클 계정 생성

create user [계정이름] identified by [패스워드]; -- 계정생성 grant create session to [계정이름]; --세션 권한주기

◎ 오라클 패스워드 기간 확인 및 변경

▼ 내용

오라클은 11g 로 넘어오면서 계정의 패스워드 기간을 기본값으로 180일로 지정되있다. 계정생성후 180일이 지나면 패스워드가 만료됫다고 뜹니다. 이걸 없애기 위해선 아래와같이 명령문을 날려야합니다.

select * from dba_profiles where profile = 'DEFAULT'; //-- 패스워드기간확인 기본값은 180일 alter profile default limit password_life_time unlimited; //-- unlimited 변경 (패스워드 기간의 제한이 없다란 뜻)
alter user [유저명] identified by [패스워드]; //패스워드 변경 방법

◎ 오라클 Tablespace

▼ 내용

계정을 만들떄 테이블스페이스를 지정하는 이유는 테이블들의 데이터는 파일에 쌓이는데 이파일의 이름을 tablespace로 지정하는 것이다. 그리고 그 데이터들의 보안,권한,용량 이런 처리를 위해서 별도로 테이블 스페이스로 나누는 것 이다. 아래는 다른 블로그에서 설명한 글입니다.

테이블을 저장하는 공간이란 의미도 틀린것은 아니지만 정확한 의미는 아닙니다.

오라클은 데이터베이스 관리 시스템이고 말 그대로 데이터들을 관리합니다. 즉 어딘가에 데이터들을 저장, 추출, 삭제, 변경하는 작업을 할 수 있는 것입니다. 그렇다면 데이터는 어디에 저장되는 것일까요? 물론 파일에 저장됩니다.

오라클 데이터베이스는 데이터 파일들을 가지고 있으며, 이 파일들에 데이터가 저장됩니다. 그런데 파일은 데이터가 저장되는 물리적인 공간을 말하는 것입니다.



오라클 내부에서는 데이터 블록(data block), 익스텐트(extent), 세그먼트(segment), 테이블스페이스(tablespace)라는 논리적인 개념으로 데이터 들을 관리합니다.

오라클에서 데이터를 저장하는 가장 최소의 논리적인 단위가 데이터 블록이며, 데이터 블록이 모여서 익스텐트가 되고, 익스텐트가 모여서 세그먼트, 세그먼트가 모여서 테이블 스페이스가 됩니다. 실제로 물리적인 데이터 파일(확장자가 dbf 혹은 ora인 파일)은 테이블 스페이스와 대응됩니다.

하나의 테이블 스페이스는 최소 1개의 데이터파일로 구성됩니다.

테이블 이외에도 인덱스, 프로시저, 뷰 등 다른 여러 가지 오라클 객체들이 저장됩니다.




l oracle : 11g realse2 버전사용중


◎ sessions, processes 현재 사용중인 수


▼ 내용

processes : 프로세스 수

sessions : 세션 수

CURRENT_UTILIZATION : 현재 접속 수

MAX_UTILIZATION : 오라클 기동 시점부터 지금까지 최대 접속 수

INITIAL_ALLOCATION : init.ora 파라메터에서 설정한 수치

SELECT * from v$resource_limit where resource_name in ('processes', 'sessions', 'transactions')



◎ sessions, processes 현재 날리는 쿼리

▼ 내용

아래 쿼리문중 2중 아무거나 날리면 현재 실행중인 세션이 날리는 쿼리를 알수있다.

SELECT a.sid, -- SID a.serial#, -- 시리얼번호 a.status, -- 상태정보 a.process, -- 프로세스정보 a.username, -- 유저 a.osuser, -- 접속자의 OS 사용자 정보 b.sql_text, -- sql c.program -- 접속 프로그램 FROM v$session a, v$sqlarea b, v$process c WHERE a.sql_hash_value=b.hash_value AND a.sql_address=b.address AND a.paddr=c.addr AND a.status='ACTIVE';
SELECT a.osuser ,a.SID ,a.serial# ,a.status ,b.sql_text FROM v$session a ,v$sqlarea b WHERE a.sql_address = b.address;

◎ session 접속 정보

▼ 내용

현재 접속중인 세션의 정보를 알수 있다.

SELECT username,program from v$session;

◎ sessions, processes 현재 설정된 max 수

 


▼ 내용

왼쪽은 맥스값 process 쿼리 ---------------------------------------------- 오른쪽은 맥스값 sessions 쿼리

show parameter processes; //프로세스 맥스값 조회 show parameter sessions; //세션수 맥스값 조회




◎ sessions , process 맥스값 변경

▼ 내용

최대 접속세션의 수는 다음과 같은 공식으로 이루어진다.

SESSIONS = (PROCESSES * 1.1) + 5

그러므로 processes 의 값만 변경하면 sessions 의 값은 자동으로 변경된다.

ALTER SYSTEM SET processes = 200 scope=spfile; //변경할 processes의 값을 넣어주면됨. //변경후 db 재시작 한다음 processes , sessions수 확인

세션,프로세스수 수정전




세션,프로세스수 수정후




SELECT s.status "Status", s.serial# "Serial#", s.TYPE "Type", s.username "DB User", s.osuser "Client User", s.server "Server", s.machine "Machine", s.module "Module", s.client_info "Client Info", s.terminal "Terminal", s.program "Program", p.program "O.S. Program", s.logon_time "Connect Time", lockwait "Lock Wait", si.physical_reads "Physical Reads", si.block_gets "Block Gets", si.consistent_gets "Consistent Gets", si.block_changes "Block Changes", si.consistent_changes "Consistent Changes", s.process "Process", p.spid, p.pid, si.sid, s.audsid, s.sql_address "Address", s.sql_hash_value "Sql Hash", s.action FROM v$session s, v$process p, sys.v_$sess_io si WHERE s.paddr = p.addr(+) AND si.sid(+) = s.sid AND (s.username IS NOT NULL) AND (NVL (s.osuser, 'x') <> 'SYSTEM') AND (s.TYPE <> 'BACKGROUND') ORDER BY 1;
SELECT s.INST_ID, s.SID, s.username, s.STATUS, TO_CHAR(s.SQL_EXEC_START,'yyyy.mm.dd-hh24:mi:ss') SQL_EXEC_START , TO_CHAR(TO_DATE(TRUNC( MOD(SYSDATE - s.SQL_EXEC_START,1)* 24 * 60 * 60), 'SSSSS'),'HH24:MI:SS') connect_tm , s.TERMINAL , q.sql_text, s.MODULE, s.LOGON_TIME FROM ( SELECT s.INST_ID, s.SID, s.USERNAME, s.STATUS, s.SCHEMANAME, s.MACHINE, s.TERMINAL, DECODE(s.SQL_ID,NULL, s.PREV_SQL_ID, s.SQL_ID) SQL_ID, DECODE(s.SQL_EXEC_START,NULL, s.PREV_EXEC_START, s.SQL_EXEC_START) SQL_EXEC_START , s.MODULE, TO_CHAR(s.LOGON_TIME,'yyyy.mm.dd-hh24:mi:ss') LOGON_TIME FROM GV$SESSION S WHERE ( (s.USERNAME IS NOT NULL) AND (NVL (s.osuser, 'x') <> 'SYSTEM') AND (s.TYPE <> 'BACKGROUND')) AND s.PROGRAM = 'w3wp.exe' ) s, (SELECT INST_ID, sql_id, sql_text, first_load_time FROM gv$sql) q WHERE s.INST_ID = q.INST_ID AND s.SQL_ID = q.sql_id AND (SYSDATE - s.SQL_EXEC_START) > (300 * (1/24/60/60)) ORDER BY connect_tm desc;


  1. FlightSim 2020.01.23 16:39 신고

    같은 IT인으로서 좋은 정보 감사합니다. 맞구독해요

  2. 나그네 2020.05.12 16:50

    정보 참고합니다 감사합니다~

  3. 나그네 2021.02.18 11:06

    정보 참고합니다^^

select 절 앞에 explain plan for 을 적으면 된다

예) select * from 테이블 의 실행계획을 보고싶다면 explain plan for select * from 테이블 적으면 질의 결과에 설명되었습니다.


그후 쿼리문에 SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY('plan_table',NULL,'serial')); 날리면

실행 계획을 보여줍니다. 쉽죠?


W먼저 본인은 1초당 210개의 테이블에 INSERT,DELETE 가 일어난다.

하루에 1테이블당 86400건씩 INSERT와 DELETE 가 일어난다.

결과적으로 테이블엔 1 row 씩 밖엔 없는대.....

select 쿼리시 메모리 누수문제가 발견되었다.

나의 select 쿼리는 이 210개의 테이블에 SELECT 를 INNERT JOIN 으로 3개씩 묶고 UNION ALL 로 70개씩 하여서 1쿼리로 날렷는대...

처음 insert와 delete가 안일어낫을경우엔 0.01초면 갖고오던게

하루 이틀 동안 insert 와 delete 가 반복되고 나서는 80초~160초로 왔다리 갔따리 했다... 이거 해결할려고 2주동안 헤메었는데.... 해결방법을 말하려고 여기다 적는다..

일단 문제는 delete 시 row는 1개지만 찌꺼기 데이터가 남아 그 찌꺼기 데이터가 각 테이블에 storage (스토리지)에 블록으로 영역은 그대로 남아있다.

이걸 select로 full scan 할경우 찌꺼기 데이터영역까지 scan을 해버려서 쿼리가 늦어지는 거였고 full scan을 캐시메모리에 올려버리니 메모리 누수처럼 select시 메모리가 계속 올라가던거였다.

해결방법은

1. truncate로 각테이블마다 데이터를 날린다. (문제는 백업이 안됨)

2. index를 생성하여 select 를 full sacn을 하지않는다. (insert의 성능이 조금 저하됨)

이 두가지 방안으로 해결하였다 하고나니

select시 매우 쾌적하다..... 쾌? 퀘? 모르겠네 ...

그래서 본인이 만든 테이블들은 백업이 전혀필요가없는 실시간 모니터링 테이블이라 하루단위로 truncate를 하고 index를 생성하였다.

먼저 index를 생성하는 문법

create index 인덱스명 on 테이블명(컬럼명1 ASC|DESC, 컬럼명2....);

위 문법 으로 index를 생성한 후 인덱스를 할 컬럼명을 설정해주면 select 시 full scan을 하지않고 where 절에 있는 컬럼명(인덱스컬럼명)

으로 조회를 한다. 여기서 주의할점은 select 시 꼭 where 조건을 써야하며 where 조건으로 index를 건 컬럼을 써줘야한다 그래야

인덱스를 타서 조회를 한다

그렇기 때문에 select 시 속도가 빨라진다.

요약

1. insert,delete가 엄청많이 일어나는 테이블을 (row 는 1개) full scan시 문제

2. 해결방안 index 생성 or truncate 로 insert,delete 할떄 남는 찌꺼기 데이터 truncate로 제거

아래는 찌꺼기 데이터가 남는 거에 대한 설명이다 (퍼옴)

1. Reorg 등장배경 & 세그먼트의 관리

Oracle Database 10g가 새로 제공하는 공간 재 확보 기능, 온라인 테이블 재구성, 스토리지 증가량 예측 기능 등을 이용하요 세그먼트 공간을 효율적으로 관리할 수 있습니다.

오래 전, Oracle Database의 경쟁 RDBMS 제품을 평가해 달라는 요청을 받은 일이 있습니다. 경쟁사의 프리젠테이션이 진행되는 동안, 청중들이 가장 감탄했던 기능이 바로 온라인 재구성(online reorganization) 기능이었습니다. 이 제품은 (오라클로 따지면 세그먼트에 해당하는) 영역의 데이타 블록을 온라인 상태에서 재배치하는 기능을 제공했습니다.

당시 오라클이 제공하던 Oracle9i Database는 이러한 기능을 제공하지 못했습니다. 이제 Oracle Database 10g는 온라인 상태에서 낭비되는 공간을 재 확보하고 오브젝트를 보다 컴팩트(compact)한 형태로 관리할 수 있게 하는 기능을 추가적으로 제공합니다.

이 기능을 자세히 살펴 보기에 앞서, 이전에는 세그먼트 관리를 어떤 방법으로 수행했는지 설명하도록 하겠습니다.

1.1 기존의 관리방법

그림 1과 같은 형태로 채워진 세그먼트를 가정해 봅시다. 작업이 수행되면서 그림 2와 같이 일부 로우(row)가 삭제되고 나면 낭비되는 공간이 생기게 됩니다. 낭비되는 공간은 (i) 남아있는 블록의 마지막 영역과 기존 테이블의 마지막 영역의 사이에서, 그리고 (ii) 로우가 부분적으로만 삭제된 블록 내부에서 발생합니다.

오라클이 이 영역에 대한 할당을 바로 해제하지 않고, 새로운 insert 작업 및 기존 로우의 확장에 대비한 예비 공간으로 활용합니다.

지금까지의 점유되었던 공간의 최고점을 High Water Mark(HWM)이라 부릅니다.

(그림 2 참고).

하지만 이와 같은 접근 방식에는 두 가지 문제점이 존재합니다:

- 사용자의 쿼리가 풀 테이블 스캔을 발생시키는 경우, 오라클은 (설사 관련된 데이타가 전혀 존재하지 않는 경우라 하더라도) HWM 아래쪽의 모든 영역을 스캔합니다. 이로 인해 풀 테이블 스캔에소요되는 시간이 길어질 수 있습니다.

- 로우가 direct path 정보와 함께 insert 되는 경우 (예를 들어 APPEND 힌트를 사용한 Insert, 또는 SQL*Loader direct path를 통해 insert 되는 경우) 새로 추가 되는 데이타 블록은 HWM의 위쪽 영역에추가됩니다. 따라서 HWM의 아래쪽 영역은 낭비된 채로 남게 됩니다.

Oracle9i와 그 이전 버전에서 공간을 재확보하려면, 테이블을 drop하고 다시 생성한 다음 데이터를 다시 로드하는 방식, 또는 ALTER TABLE MOVE 명령을 사용하여 테이블을 다른 테이블스페이스로 이동하는 방식을 사용해야 했습니다. 이 두 가지 방식은 모두 오프라인 상태에서 수행되어야 한다는 문제가 있습니다. 그 대안으로 online table reorganization 기능을 사용할 수도 있지만, 이를 위해서는 기존 테이블 크기의 두 배나 되는 공간이 필요했습니다.

10g의 경우 이러한 작업은 훨씬 간소화되었습니다. 10g의 Automatic Segment Space Management(ASSM)이 해당 테이블스페이스에 활성화되어 있는 경우, 세그먼트, 테이블, 인덱스를 shrink하고 free block을 재 확보한 뒤 다른 용도로 할당하도록 데이터베이스로 반환됩니다. 자세한 방법을 마지막 장에서 설명해 드리겠습니다.

2. Reorg 란?

대상 Table의 Data를 Physical하게 재편성하여 DML 작업으로 인한 Fragmentation을 제거하는 작업 입니다.

테이블이 여러 번 수정되어 데이터가 분할되고 액세스 성능이 현저하게 느려지게 되면 REORG TABLE 명령이 최우선적인 튜닝 요소로 지적 됩니다.

Reorg 명령은 조각난 데이터 및 인덱스를 조각나지 않은 실제로 연속된 페이지로 재 빌드 함으로써, 복잡하고 불필요하게 공간을 차지하고 있는 오브젝트(테이블 및 인덱스)들을 최적화 할 수 있으며, 이로 인해 액세스 되는 블록도 감소시켜 SQL 쿼리의 성능 향상도 어느 정도 꾀 할 수 있습니다.

출처: http://tocsg.tistory.com/33 [투씨에스지 기술 블로그] 


+ Recent posts