*JOIN 원리
--DBMS 작동원리 : 평소에 데이터는 하드디스크의 데이터 파일에 저장해 두었다가 필요한 시점에 메모리로 복사한다.
--(오라클은 이때 사용하는 메모리를 데이터베이스 버퍼 캐시라고한다)
-- 여기서 중요한 것은 칼럼 100개를 가진 테이블이 하드디스크에 저장되어 있을 때 사용자가 그 중 1개의 칼럼에 SELECT를
-- 수행할 경우 해당 칼럼 1개만 메모리로 복사하는 것이 아니라 일단 100개의 칼럼 모두를 메모리로 복사해 온다는 점이다.
--그래서 불필요한 I/O도 많고 메모리 사용량도 많이 생기기 때문에 정규화를 철저히 해서 부하를 최대한 줄여야한다.
--일단 메모리로 올라온 테이블에서 필요한 칼럼을 가져와서 사용자가 원하는 결과를 만들어야 한다.
1) NESTED LOOP JOIN(가장 기본적인 JOIN 기법)
SELECT E.ENAME, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
SQL을 수행하면 오라클은 아래와 같은 순서로 작업을 수행한다.
--1. 사원 테이블과 부서 테이블을 메모리(데이터베이스 버퍼 캐시)로 복사해온다.
--2. 그후에 사원테이블에서 사원이름을 꺼내서 임시 작업공간으로 가져 간다.(인덱스 상황이나 다른 요소에 따라 작업순서가 변경될 수도 있다.)
--3. 그 후에 부서 테이블에서 해당부서명을 찾으러 가는데 그때 위 SQL의 3행에 있는 조건을 보고 해당 조건에 맞는 데이터를 찾아서 부서명을 가져온다.
--4. 한 행의 작업이 끝나면 다시 처음 테이블로 돌아가서 두 번째 행의 이름을 다시 PGA로 가져온다.
--5. 다시 부서 테이블에 가서 사원 테이블에서 가져온 두 번째 행의 부서번호와 동일한 부서번호를 가진 부서명을 꺼내온다.
앞과 같은 과정을 계속 반복해서 먼저 읽었던 사원테이블의 데이터가 끝이 날 때까지 작업이 반복(LOOP)됩니다.
그래서 이 JOIN을 NESTED LOOP JOIN이라고도 하며 모든 JOIN의 기본이 되는 JOIN이다.
또한 JOIN을 수행하는 횟수는 먼저 읽는 테이블의 행 수 만큼 JOIN이 수행된다.
그래서 먼저 읽는 테이블이 JOIN의 성늘을 결정한다고해서 DRIVING TABLE(선행 테이블)이라고 부르고 나중에 읽는 테이블을 DRIVEN TABLE(후행 테이블)이라고 부른다.
여러 개의 테이블을 JOIN해야 할 경우 JOIN의 성능은 어떤 테이블을 선행 테이블로 설정하는가가 아주 중요하다.
이것을 결정해 주는 오라클 내부 구성요소가 옵티마이저인데 RULE BASED OPTIMIZER(규칙 기반 옵티마이저)를 사용할 경우에는 쿼리를 수행하는 사람이 선행 테이블을 계산해서 결정해야 했다.
그래서 실력좋은 개발자나 DBA일 경우 JOIN 작업을 아주 빠르게 수행할 수 있지만 실력이나 경험이 부족한 사람이 작성한 JOIN은 성능이 아주 느린 경우가 많다.
그러나 현재 옵티마이저의 주류를 이루는 COST BASED OPTIMIZER(비용 기반 옵티마이저)는 이런 부분이 자동화 되어서 인덱스만 잘 만들어져 있다면 아주 좋은 성능을 내도록 해주고 있다.
(PGA : PROGRAM GLOBAL AREA의 약자로 단어가 가진 의미 그대로 공유되지 않고 혼자서만 사용하는 공간.
PGA는 프로세스에 대한 데이터와 제어정보가 포함되 비 공유 메모리 영역으로 서버 프로세스가 시작될 때 생성되며 데이터 베이스에 접속하는
모든 사용자에게 할당된 각각의 프로세스가 독자적으로 사용하는 오라클 데이터베이스의 메모리 공간이다.
즉, 한 프로세스 혹은 스레드의 개별적인 메모리 공간으로 다른 프로세스와 스레드는 접근 불가, 사용자마다 공유하지 않고 개별적으로 사용한다.)
(SGA : SYSTEM GLOBAL AREA 오라클 프로세스들이 접근하는 하나의 큰 공유 메모리 세그먼트.)
위와 같은 SQL을 수행하게 되면 오라클은 emp 테이블의 Smith를 가져오고 Smith의 DNAME을 찾으로 DEPT 테이블로 가게 된다.
그런데 DEPT 테이블에 데이터가 많을 경우 어떤 DNAME을 가져와야 할지 모르기 때문에 SQL 문자의 WHERE 절에 있는 조건을 보고 그 조건에 맞는 DNAME을 가져오는 것이다.
만약 SQL 문장에서 WHERE 절에 잘못된 조건을 줄 경우나 조건을 안 줄 경우에는 올바른 데이터를 가져오지 못한다.(모든 데이터를 다 가져오게 되며 이를 카티션 곱이라 한다.)
'DB > ORACLE' 카테고리의 다른 글
[ORACLE] 3. 단일행 함수 - 형변환 함수 (0) | 2015.02.11 |
---|---|
[ORACLE] 2. 단일행 함수 - 날짜함수 (0) | 2015.02.10 |
[ORACLE] 1. 단일행 함수 - 숫자함수 (0) | 2015.02.10 |