데이터베이스
-
고급 조인 기법데이터베이스 2021. 6. 20. 21:11
인라인뷰 활용 배타적 관계의 조인 부등호 조인 BETWEEN 조인 ROWID 활용 1. 인라인 뷰 활용 대부분 조인 1:M 관계인 테이블끼리의 조인이다. 조인 결과는 M 쪽 집합과 같은 단위가 된다. 이를 다시 1쪽 집합 단위로 그루핑해야 한다면, M 쪽 집합을 먼저 1쪽 단위로 그루핑하고 나서 조인하는 것이 유리하다. 조인 횟수를 줄여주기 때문인데, 그런 처리를 위해 인라인 뷰를 사용할 수 있다. 2009년도 상품별 판매수량과 판매금액을 집계하는 아래 쿼리를 예로 살펴보자. 일별상품판매 t1 (M) : 상품 t2 (1) select min(t2.상품명) 상품명, sum(t1.판매수량) 판매수량, sum(t1.판매금액) 판매금액 from 일별상품판매 t1, 상품 t2 where t1.판매일자 betwee..
-
스칼라 서브쿼리데이터베이스 2021. 6. 20. 21:05
쿼리에 내장된 또 다른 쿼리 블록을 서브 쿼리라고 하는데, 그 중에서 함수처럼 한 레코드당 정확히 하나의 값만 리턴하는 서브쿼리를 스칼라 서브 쿼리라고 한다. 주고 select-list 에서 사용되지만 몇 가지 예외상황을 뺀다면 컬럼이 올 수 있는 대부분의 위치에서 사용 가능하다. select empno, ename, sal, hiredate, (select d.dname from dept d where d.deptno=e.deptno) dname from emp e where sal>=2000; 스칼라 서브 쿼리를 사용한 위 쿼리 문장은 아래 Outer 조인문과 100% 같은 결과를 낸다. 즉 dept 와 조인에 실패하는 emp 레코드가 있다면 dname 으로 null 값이 출력된다. select /*..
-
해시 조인데이터베이스 2021. 6. 19. 19:33
1. 기본 매커니즘 해시조인은 둘 중 작은 집합(Build Input)을 읽어 해시 영역(Hash Area)에 해시 테이블(=해시 맵)을 생성하고, 반대쪽 큰 집합 (Probe Input)을 읽어 해시 테이블을 탐색하면서 조인하는 방식이다. select /*+ordered use_hash(e)*/ d.deptno, d.dname, e.empno, e.ename from dept d, emp e where d.deptno=e.deptno ------------------------------------- Execution Plan ------------------------------------- 0 SELECT STATEMENT Opimizer=CHOOSE (Cost=5 Card=654 Bytes=35K..
-
소트 머지 조인데이터베이스 2021. 6. 19. 19:03
NL 조인은 조인 컬럼을 선두로 갖는 인덱스가 있는지가 매우 중요하다. 만약 조인 컬럼을 선두로 갖는 인덱스가 없으면 Outer 테이블에서 읽히는 건마다 Innder 테이블 전체를 스캔하기 때문이다. 그럴 때 옵티마이저는 소트 머지 조인이나 해시 조인을 고려한다. 소트 머지 조인은 이름이 의미하는 것처럼 두 테이블을 각각 정렬한 다음에 두 집합을 머지(merge) 하면서 조인을 수행한다. 소트 머지 조인은 아래 두 단계로 진행된다. 1. 소트 단계 : 양쪽 집합을 조인 컬럼 기준으로 정렬한다. 2. 머지 단계 : 정렬된 양쪽 집합을 서로 merge 한다. 만약 조인 컬럼에 인덱스가 있으면(오라클의 경우 outer 테이블에만 해당), 1번 소트 단계를 거치지 않고 곧바로 조인할 수도 있다. 오라클은 조인 ..
-
NL 조인데이터베이스 2021. 6. 17. 21:31
1.기본 매커니즘 begin for outer in (select deptno,empno, rpad(ename,10) ename from emp ) loop --outer 루프 for inner in (select dname from dept where deptno=outer.deptno ) loop --inner 루프 dbms_output.put_line(outer.empno||':'||outer.ename||':'||inner.dname); end loop; end loop; end; 2. NL 조인 수행 과정 분석 select /*+ ordered use_nl(e) */ e.empno ,e.ename ,d.dname ,e.job ,e.sal where e.deptno = d.deptno ------..
-
인덱스 튜닝 기초데이터베이스 2021. 6. 13. 20:57
1. 인덱스 ROWID 에 의한 테이블 랜덤 엑세스 2. 테이블 엑세스 최소화 튜닝 인덱스 기본 원리에서 살폈듯이, B*Tree 인덱스를 정상적으로 사용하려면 범위 스캔 시작지점을 찾기 위해 루트 블록부터 리프 블록까지의 수직적 탐색 과정을 거쳐야 한다. 만약 인덱스 선두 컬럼이 조건절에 사용되지 않으면, 범위 스캔을 위한 시작점을 찾을 수 없어 옵티마이저는 인덱스 전체를 스캔하거나 테이블 전체를 스캔하는 방식을 선택한다. 인덱스 선두 컬럼이 조건절에 사용되더라도 범위 스캔이 불가능하거나 인덱스를 아예 사용 못하는 경우들을 살펴본다. 1. 범위 스캔이 불가능하거나 인덱스 사용이 불가능한 경우 아래 세가지 경우는 인덱스 범위 스캔이 불가능하지만 index Full Scan 은 가능하다. 마지막 쿼리문의 경..
-
인덱스 기본 원리데이터베이스 2021. 5. 30. 14:16
수평적탐색과 수직적 탐색 다양한 인덱스 스캔 방식 다양한 인덱스 종류 대용량 테이블에서 필요한 데이터를 빠르게 찾기 위해 인덱스의 도움이 필요하다. 그림 III-3-1 은 인덱스 컬럼이 양의 정수만 저장할 수 있는 데이터 타입이라고 가정했을 때 예시이다. 처음에는 단 하나의 루트 노트에서 데이터가 쌓이면서 루트, 브랜치, 리프 노드를 모두 갖춘 나무 형태로 성장한다. 루트에서 리프블록까지의 거리를 인덱스 깊이(Height)라고 부르며, 인덱스를 반복적으로 탐색할 때 성능에 영향을 미친다. 루트와 브랜치 블록은 각 하위 노드들의 데이터 값 범위를 나타내는 키 값과 그 키값에 해당하는 블록을 찾는데 필요한 주소정보를 가진다. 리프 블록은 인덱스 키 값과 그 키 값에 해당하는 테이블 레코드를 찾아가는데 필요한..
-