오라클 서버의 구조>


1. 프로세스 구조 : 3가지


1) 사용자 프로세스 : 현재 어떤사용자가 어떤 툴로 접속했는지 접속정보 . 접속일자,사용자/암호


2) 서버프로세스(PGA) : 구문분석(parse), 실행(execute), 인출(fetch)


3) 백그라운드 프로세스

DBWR

CKPT

LGWR

PMON

SMON



instance : SGA 3가지 영역 + 백그라운드프로세스 5가지



2. 메모리 구조(SGA영역 )

필수3가지

- Data Buffer Cache

- Redo Log Buffer

- Shared Pool

  ; 캐시영역은 여러개의 블록으로 구성

  ; 각 블록의 크기는 initSID.ora 파일에 지정되어 있는 DB_BLOCK_SIZE 임.

  ; DB_BLOCK_SIZE은 한번 생성한 후에는 수정할수 없음.

  ; 일반적으로 다수의 사용자가 사용하는 시스템(OLTP)인 경우는 빈번한 사용으로 메모리의 조각화를 최소화하기 위해 블록사이즈를 작게 설정하고, DW,DSS같은 소수의 사용자가 다량의 데이터를 사용하는 구조는 블록사이즈를 크게 한다. 


옵션 

-Large Pool




3. 파일 구조

Data files

Control files

Redo log files

Archived log files

Parameter file

Password file

--> 물리적 : files   논리적 : DataBase




[select문 처리과정]

1)구문분석(parse)

- 구문분석. 문법이 맞는지. 존재하는 오브젝트인지. 권한 체크 등 검사--> 실행계획

- 처음 실행되면 Shared pool / Library cache 에 sql문장의 파싱결과를 로드함.

- sql문장과 동일한 문장을 메모리영역의 파싱된 결과와 비교.

- 동일한 문장이 존재하면 바로 사용.( 문장의 구문검사, 실행계획없이 바로 사용)

- 메로리는 한정되어 있으므로 저장할 공간이 없으면 LRU(Least Recently Used list)알고리즘에 의해 가장오래된 공간를 비우고 그 공간을 사용한다.


2) 실행(execute)

- 서버프로세스가 Data files로 부터 읽어서 Data Buffer Cache에 로드하는 행위


3) 인출(Fetch)

- Data Buffer cache영역에 로드되어 있는 정보를 읽어서 사용자화면에 보여주는 행위

( update, delete, insert는 fetch행위하지 않음. )



parsing할때 

select * from dept where deptn =:a

문장은 재사용이 가능한 정적인 SQL이다. 

그러나,

SQL ="SELECT * FROM DEPT WHERE DEPTNO ='" & v_dept & "'" 

이런식으로 사용하면 재사용이 불가능하다. 실행할때마다 구문검사, 실행계획을 수행하기 때문에 문제가 될수 있다.






'DBMS > 오라클기타' 카테고리의 다른 글

테이블 정보 query  (0) 2013.06.06
trigger  (0) 2013.06.04
오라클 EXPORT  (0) 2013.05.17
오라클 IMPORT  (0) 2013.05.17
Cluster  (0) 2013.05.12



Export 방법


Export Option   주로 사용되는 option 은 다음과 같다.


$ exp userid=user/passwd


 file

  export 받는 dump file 을 지정

 log 

  export 받을 때 log file 을 지정하여 export 수행 결과 확인

 rows 

  data 를 받을 것인지 아닌지를 지정. Default 는 y

 constraints 

  table 에 설정된 제약조건을 받을 것인지를 결정. Default는 y

 tables 

  user의 특정 table 을 받고자 할 때 사용. Default 는 userid 에 지정된 user 의 모든 table 을 받는다.

 indexes 

  index 를 받을 것인지를 지정. Default 는 y

 compress 

  1개의 extent 에 import 할 수 있도록 export 되도록 지정. Default는 y. 이 값을 n 으로 지정하면, create table 이나 alter tables 에 의해 지정된 storage paramter 들 ( initial extent,next extent ) 을 사용한다.

 buffer 

  export 받을 때 한번에 fetch 되는 row 의 최대 수를 지정.

 full 

  userid 가 system/manager 나 dba 권한이 있는 user 일 경우에만 setting가능한데, database 전체를 받고자 할 때 사용된다.

 

* export 수행시 사용되는 option 의 default 값은 Oracle version 에 따라 다를 수 있으므로 실제 실행시에는 $exp help=y 로 각 option 의 default값을 확인하여야 한다.





Export example>


 Database 전체 export


  Database 전체를 export 하려면 DBA 권한이 있는 system user 이어야 하며 full=y option 이 있어야 한다.


  $exp system/manager file=/backup/0220.dmp log=/backup/0220.log


 User 단위 export

 

  $exp scott/tiger file=/backup/scott0220.dmp log=/backup/scott0220.log


 Table 단위 export

 

  $exp scott/tiger file=/backup/scott0220table.dmp log=/backup/scott0220table.log tables=emp,dept,salary




주의 사항 ]

* Export 시에는 user 의 환경변수, 특히 NLS_LANG 의 값이 중요한데, prompt 상에서 export 할 때에는 Oracle Unix Account 와 Database 의 NLS_LANG 이 일치한 상태이므로 상관이 없지만, crontab 을 이용하여 주기적으로 export 를 받는 경우 환경변수를 주의하여 지정하여야 한다. 

즉, crontab 이 실행할 shell script 에서 환경변수 설정시 NLS_LANG 값이 Database 의 것과 틀리면, 이 dump file 은 import 시 값이 제대로 들어가지 않는다.



'DBMS > 오라클기타' 카테고리의 다른 글

trigger  (0) 2013.06.04
오라클데이터베이스 구조  (0) 2013.05.20
오라클 IMPORT  (0) 2013.05.17
Cluster  (0) 2013.05.12
SubQuery  (0) 2013.05.12

Import 방법


Import Option

Import 를 수행하기 위해서는 반드시 export 한 dump file 이 존재해야 하며, export 할 당시의 option 에 따라 import 가 제약을 가진 다. 즉, table 만 export 받은 dump file 로는 table 만 import 할 수 있지 index 나 constraints 는 import 할 수 없다.


Import 를 수행할 때에 자주 사용되는 option 은 다음과 같다.


$imp userid=user/passwd


* file : export 받은 dump file 을 지정

* log : import 받을 때 log file 을 지정하여 import 의 수행결과 확인

* indexfile : data 를 import 하지 않고 create index 문장의 sql 을 저장한 file생성

* rows : data 를 import 할 것인지의 여부를 선택. Default 는 y

* indexes : index 를 import 할 것인지의 여부를 선택. Default 는 y

* fromuser : 다른 user 에게 export file 을 import 하고자 할 때, export 한 user를 지정

* touser : import 할 user 를 지정

* buffer : import 할 때 한번에 import 되는 row 의 최대 수를 지정

* commit : import 시에 table 별로 commit 을 할 것인가 (value n), row ( buffer )별로 commit 할 것인가를 지정 (value y). Default n

* full : full export 한 file 에 대하여 DBA 권한이 있는 user 로 database 전체를 import 할 때 사용. Default y

* feedback : import 시에 얼마만큼의 data 가 import 되었는지를 보여준다.

지정된 수자만큼 data 가 import 되면, ‘.’ 이 display 된다.




Import Process Sequence

1. Create table ... 명령이 실행되어서 new table 이 생성된다. constraints 가 작성된다.

2. Create index ... 명령이 실행된다.

3. Data 가 import 되고 index 가 update 된다.

4. Trigger 가 import 되고, integrity constraints 가 enable 된다.




효율적인 import 방법

System의 downtime 을 줄이기 위해 먼저 data 를 import 를 하여서, database 를 사용자에게 먼저 open 한 후에 index 를 creation 한다. 이렇게 하면 실제 database를 사용자에게 open 후에 application 이 full table scan 을 하여서 성능이 저하되기는 하지만, 빠른 시간내에 database 를 open 할 수 있다는 장점이 있다.


< 1 단계 >

전체 database 를 export 한다.

$ exp system/manager file=fullexp0220.dmp log=fullexp0220.log full=y


< 2 단계 >

data 만을 import 한다.

$ imp system/manager file=fullexp0220.dmp log=fullimp0220.log full=y indexes=n


< 3 단계 >

import option 중에 indexfile 을 사용하여 index 를 생성하는 script 를 생성한다.

$ imp system/manager file=fullexp0200.dmp indexfile=index.sql full=y


< 4 단계 >

<2 단계>, <3 단계> 가 성공적으로 수행되고 나면, database 를 사용자에게 open한다.


< 5 단계 >

<3 단계> 에서 생성된 index creation script 인 index.sql 를 sqlplus 에서 돌려준다.

SQL> @index







'DBMS > 오라클기타' 카테고리의 다른 글

오라클데이터베이스 구조  (0) 2013.05.20
오라클 EXPORT  (0) 2013.05.17
Cluster  (0) 2013.05.12
SubQuery  (0) 2013.05.12
view  (0) 2013.05.12

- 튜닝의 가장 큰 적은 Disk I/O

- Disk I/O를 줄이기 위해 Partition Table이 나오고,  스캔방식의 경우에는 다량의 데이터 범위에서 성능저하가 발생하므로 연산에 의한 데이터 검색 Bitmap 인덱스, 연산에 의한 Join방식인 Hash Join이 나옴.


- Cluster는 Cluster Key로 지정한 값을 기준으로 데이터를 그룹화 해놓은것.

Cluster Key로 지정된 컬럼은 단 하나의 값만 저장.


- 인덱스나 테이블과 같은 별도의 저장공간을 가지는 object.

- 테이블에 데이터를 저장하거나 인덱스를 생성하면 테이블스페이스내에 Random하게 저장된다. 찾고자 하는 데이터가 일정지역에 모여있을수도 있고, 흩어져 있을수도 있다. Disk를 여러번 스캔할수 있으므로, 작업량 증가.

DBA는 일년에 한두번  테이블 Reorganization작업을 한다.

- Cluster를 만들고 테이블을 만들면 Cluster Key가 중심이 되어 데이터를 그룹화 저장. 스캔의 부하 발생하지 않고, 저장공간 절약.

'DBMS > 오라클기타' 카테고리의 다른 글

오라클 EXPORT  (0) 2013.05.17
오라클 IMPORT  (0) 2013.05.17
SubQuery  (0) 2013.05.12
view  (0) 2013.05.12
Nested Loop Join  (0) 2013.05.05
  • Main에 종속되는 하위Query. 집합과 집합간의 연결을 통해 데이터를 추출하는 기법
  • Join의 경우는 Join되는 집합의 데이터를 추출에 사용할수 있는 반면, Sub Query는 Main Query의 결과를 추출하기 위한 상수조건 또는 체크조건으로 참여하게 된다.
  • 주종의 관계 : Sub Query가 종으로 먼저 수행된 후 Main Query의 결과를 줄여주는 역할로 참여
                       Main Query는 Sub Query의 존재와 관계없이 독자실행 가능하며, 단지 Sub Query는 범위를 줄여주는 역할.
  • 동일한 조건의 체크관계: 주종관계가 아닌 Main과 Sub가 동일한 레벨의 상태.
                       Main Query만으로 안되며, Sub Query 도 독립적 결과 를 추출할수 없다.




1. 주종관계를 가지는 Sub Query 

; Sub Query가 먼저 실행.

- 먼저 수행된다 는 것은 Sub Query가 먼저 수행되어 Main Query의 결과 추출에 참가한다는 것. 

 Main Query에 Sub Query의 조건이 상수가 되어 in 또는 = 조건으로 제공한다는 것.


Sub Query의 결과가 여러건이거나 여러건 중복이 되어 나오더라도 Sub Query의 결과를 정렬하여 Main Query 에 제공한다.
  Sub Query는 Main Query에 상수로 데이터를 제공하기 전에 데이터가 여러건이라면 Sort Unique 작업 후 제공한다.


ex>

SELECT a.code, a.name, a.deptno

   FROM tab1 a

  WHERE a.code IN ( SELECT code

                                 FROM tab2

                               WHERE gcode = '20'

                            )

; Sub Query로 범위를 줄임.

; Main Query의 상수로 데이터 제공.




2. 주종관계를 갖지 않는 Sub Query

; Main Query가 먼저 수행된 후 수행됨.


ex> 

SELECT a.code, a.name, a.deptno

   FROM tab1 a

  WHERE a.code IN ( SELECT code

                                 FROM tab2

                                WHERE deptno = a.deptno

                                    AND gcode = '20' )


; a의 deptno를 사용.

; Main Query 수행 --> Sub Query 수행 --> Main Query 수행.




3. 주종관계로 수행하는 조건

1) Sub Query 에 Main Query의 컬럼이 조건에 나오면 안됨.


2) Sub Query의 결과를 제공받는 Main Query 의 조건에 인덱스가 존재해야 한다.

   없다면 Nested loop join의 연결고리 이상으로 Full Table Scan 후 Sub Query와 연결하여 데이터를 추출할게 된다.



3) Exists를 이용한 Sub Query로의 전환

ex>

SELECT a.code, a.name, a.deptno

   FROM tab1 a

  WHERE a.code IN ( SELECT code

                                 FROM tab2

                               WHERE deptno = a.deptno

                                   AND gcode = '20'

                            )

-->


SELECT a.code, a.name, a.deptno

   FROM tab1 a

  WHERE Exists       ( SELECT code

                                 FROM tab2

                               WHERE deptno = a.deptno

                                   AND gcode = '20'

                            )



4) Not In의 성능개선


SELECT a.code, a.name

   FROM tab1 a

  WHERE a.code Not IN ( SELECT code

                                      FROM tab2

                                   WHERE gcode = a.code )

-->

SELECT a.code, a.name

   FROM tab1 a

  WHERE a.code IS NOT NULL

      AND a.code Not IN ( SELECT /*+ MERGE_AJ */

                                               deptno

                                      FROM tab2

                                   WHERE gcode = a.code 

                                        AND deptno IS NOT NULL )


; Not In을 사용하는 경우Hint를 이용하여 성능개선

; Oracle Optimizer Hint 중 /*+ MERGE_AJ */ /*+ HASH_AJ */

; 교집합의 데이터를 추출하는 것이 아니라 양쪽집합의 차집합을 추출하는 것. 

각각을 수행하여 병합에 실패한 데이터만 추출하는 Merge Anti Join이나 동시에 각각의 데이터를 추출하여 Hash Join의 실패한 데이터만 추출하는 Hash Anti Join

; 각 집합의 조건에 참여하는 부분이 Not Null이어야 한다.

; 조건에 Is Not Null이 반드시 있어야 한다.(필수)






'DBMS > 오라클기타' 카테고리의 다른 글

오라클 IMPORT  (0) 2013.05.17
Cluster  (0) 2013.05.12
view  (0) 2013.05.12
Nested Loop Join  (0) 2013.05.05
전체 범위 처리 & 부분 범위 처리  (0) 2013.05.05

+ Recent posts