1. 옵티마이저와 실행계획
(1) 의미
- 사용자가 질의한 SQL문에 대해 최적의 실행 방법을 결정하는 역할을 수행한다.
즉, SQL실행시 실행계획을 수립하는 것이다.
- 사용자 요구사항을 만족하는 결과를 추출할 수 있는 다양한 실행 방법들 중에서 최적의 실행 방법을 결정하는 것이 옵티마이저의 역할이다.
- 옵티마이저가 선택한 실행 방법의 적절성 여부는 질의의 수행 속도에 가장 큰 영향을 미치게 된다.
- 옵티마이저는 실제로 SQL문을 처리해보지 않은 상태에서 최적의 실행 방법을 결정해야 하는 어려움이 있다.
(2) 옵티마이저 종류
① 규칙기반 옵티마이저 (RBO)
- 규칙 : 보편 타당성에 근거한 것들
- 우선순위
② 비용기반 옵티마이저 (CBO)
- SQL문을 처리하는데 필요한 비용( 소요시간 또는 자원 사용량)이 가장 적은 실행 계획을 선택하는 방식
- 비용을 예측하기 위해서 규칙기반 옵티마이저는 사용하지 않는 테이블, 인덱스, 칼럼 등의 다양한 객체 통계정보와 시스템 통계 정보 등을 이용한다.
- 정확한 통계정보를 유지하는 것은 비용기반 최적화에서 중요한 요소임.
- 동일 SQL문도 서로 다른 실행 계획이 생성될 수 있음 / 다양한 한계들로 인해 실행계획의 예측 및 제어가 어려움
ㆍ 질의 변환기 : 사용자가 작성한 SQL문을 작업하기가 보다 용이한 형태로 변환하는 모듈
ㆍ 대안 계획 생성기
: 동일한 결과를 생성하는 다양한 대안 계획을 생성하는 모듈
: 현실적인 제약으로 인해 생성된 대안 계획들 중에서 최적의 대안 계획이 포함되지 않을 수도 있음
ㆍ 비용 예측기 : 대안 계획 생성기에 의해서 생성된 대안 계획의 비용을 예측하는 모들
③ 실행계획
- SQL에서 요구한 사항을 처리하기 위한 절차와 방법
- 실행계획을 생성: SQL을 어떤 순서로 어떻게 실행할 지를 결정하는 방법
- 옵티마이저는 다양한 처리 방법들 중에서 최적의 실행계획을 예측해서 생성해 준다.
- 실행계획을 보고 SQL이 어떻게 실행되는지 정확히 이해할 수 있다면 보다 향상된 SQL 이해 및 활용을 할 수 있다.
- 최적화 정보 : 실제로 SQL을 실행하고 얻은 결과가 아니라 통계 정보를 바탕으로 옵티마이저가 계산한 예상치이다.
- 연산(Operation) : 여러 가지 조작을 통해서 원하는 결과를 얻어 내는 일련의 작업
조인 기법 : 두 개의 테이블을 조인할 때 사용할 수 있는 방법
엑세스 기법 : 하나의 테이블을 엑세스 할 때 사용할 수 있는 방법
최적화 정보
ㆍCost : 상대적인 비용
ㆍCard : 주어진 조건을 만족한 결과 집합 혹은 조인 조건을 만족한 결과 집합의 건수
ㆍBytes : 결과 집합이 차지하는 메모리 양을 바이트로 표시한 것
④ SQL 처리 흐름도
- SQL의 내부적인 처리 절차를 시각적으로 표현한 도표
- SQL문 처리를 위한 조인 순서, 테이블 엑세스 기법과 조인 기법 등을 표현할 수 있다.
2. 인덱스 index
(1) 인덱스 특징
- 빠른 검색 및 조회 가능.
- 기본적인 목적 : 성능의 최적화
- 인덱스의 칼럼 순서는 질의 성능에 중요한 영향을 미치는 요소
(2) B트리 기반 인덱스
① 루트 블록 ROOT
- 브랜치 블록 중에 최상위에 있는 블록
- 인덱스를 구성하는 칼럼의 데이터와 레코드 식별자로 구성되어 있음
② 브랜치 블록 BRANCH
- 다음 단계의 블록을 가리키는 포인트를 가지고 있음
③ 리프 블록 LEAF
- 트리의 최하위 단계에 존재
- 양방향 링크를 가지고 있음-> 이것을 통해 오름차순과 내림차순 검색 가능.
(3) 전체 테이블 스캔
① 테이블에 존재하는 모든 데이터를 읽어 가면서 조건에 맞으면 결과로서 추출하고 조건에 맞지 않으면 버리는 방식으로 검색
② 옵티마이저가 연산으로서 FTS(full table scan)방식을 선택하는 이유
- SQL문에 조건이 존재하지 않는 경우
- SQL문에 주어진 조건에 사용 가능한 인덱스가 존재하지 않는 경우
- 옵티마이저의 취사 선택
- 그 밖의 경우 : 병렬처리 방식으로 처리하는 경우 / 전체 테이블 스캔 방식의 힌트를 사용한 경우
(4) 인덱스 스캔
① 인덱스를 구성하는 칼럼의 값을 기반으로 데이터를 추출하는 엑세스 기법
② 인덱스에 존재하지 않는 컬럼의 값이 필요한 경우에는 현재 읽은 레코드 식별자를 이용하여 테이블을 엑세스 해야 함
③ 인덱스 스캔 방법
- 인덱스 유일 스캔
: 유일 인덱스를 사용하여 단 하나의 데이터를 추출하는 방식
: 중복을 허락하지 않는 인덱스임
: 유일 인덱스 구성 칼럼에 대해 모두 = 로 값이 주어진 경우에만 가능한 인덱스 스캔 방식
- 인덱스 범위 스캔
: 인덱스를 이용하여 한 건 이상의 데이터를 추출하는 방식
(5) 전체 테이블 스캔 vs 인덱스 스캔 방식 비교
3. 옵티마이저 조인
- 두 개 이상의 테이블을 하나의 집합으로 만드는 연산
- 두 테이블 사이에서 수행
- 조인을 수행할 때 조인 단계별로 다른 조인 기법을 사용할 수 있음
(1) Nested Loop Join
- 랜덤엑세스가 발생하는데, 소량의 업무 처리에 적합. 양줄여야 성능향상됨.
※ 랜덤엑세스란? 선행테이블 인덱스 검색후, 후행 테이블의 인덱스를 찾는다.
- 반복문과 유사한 방식으로 조인을 수행
- 선행 테이블의 조건을 만족하는 행을 추출하여 후행 테이블을 읽으면서 조인을 수행함 (선행테이블 먼저찾은후, 후행 테이블 조인)
- 선행: outer table / 후행: inner table
- 선행 테이블의 크기가 작은것 먼저 찾는것이 중요함. 스캔의 범위를 줄일 수 있기때문 -> 성능 향상.
- 처리 범위가 좁은 것이 유리함
- 조인 작업 방법
ㆍ선행 테이블에서 주어진 조건을 만족하는 행을 찾음
ㆍ선행 테이블의 조인 키 값을 가지고 후행 테이블에서 조인 수행
ㆍ선행 테이블의 조건을 만족하는 모든 행에 대해 반복 작업 수행
(2) Sort Merge Join
- 양쪽 테이블의 처리범위를 각자 엑세스하여 정렬한 결과를 차례로 스캔하면서 순차비교 함으로 인덱스를 사용하지 않음
- 두 테이블을 Sort-Area라는 메모리공간에 모두 로딩-> Sort 수행 -> Merge 수행.
- 정렬 비용 필요 / 드라이빙 테이블 의미 없음 / Non-Equi 조인 가능
- 정렬 발생하기 때문에 데이터가 많으면 성능저하 될 수 있음
- 조인 칼럼을 기준으로 데이터를 정렬하여 조인을 수행
- 주로 스캔 방식으로 데이터를 읽음
- 넓은 범위의 데이터를 처리할 때 주로 이용됨
- 동등 조인 뿐만 아니라 비동등 조인에 대해서도 조인 작업이 가능함
- 조인 작업 방법
ㆍ 독립적으로 각각의 테이블에서 데이터를 추출할 수 있음
ㆍ 독립적으로 각각의 테이블에서 조인키를 기준으로 정렬 작업 수행
ㆍ 정렬 결과를 이용하여 조인을 수행하여 조인에 성공하면 추출 버퍼에 넣음
(3) Hash Join
- 두 테이블중 작은 테이블(선행테이블)을 HASH메모리에 로딩하고, 두 테이블의 조인키 사용해서 해시테이블 생성한다.
- 일반적으로 조인되는 두 집합의 크기 차이가 나지 않는 경우나 하드웨어 자원이 부족하지 않을 경우에는 성능이 좋음
- 선행테이블이 충분히 메모리에 로딩되는 크기여야 한다. CPU 연산이 많이 듦.
- 조인을 수행할 테이블의 조인 칼럼을 기준으로 해쉬 함수를 수행하여 서로 동일하나 해쉬 값을 갖는 것들 사이에서 실제 값이 같은지를 비교하면서 조인을 수행
- NL JOIN의 랜덤 엑세스 문제점과 SMJ의 문제점인 정렬 작업의 부담을 해결하기 위한 대안으로 등장
- 동등 조인에서만 사용할 수 있음
- 결과 행의 수가 적은 테이블을 선행 테이블로 사용하는 것이 좋음
- 조인 작업 방법
ㆍ 선행 테이블의 조인 키를 기준으로 해쉬 함수를 적용하여 모든 데이터에 대한 해쉬 테이블 생성
ㆍ 후행 테이블의 조인 키를 기준으로 해쉬 함수를 적용하여 해당 버킷을 잡음
ㆍ 후행 테이블의 조건을 만족하는 모든 행에 대해서 반복 수행
'Back-end > DataBase' 카테고리의 다른 글
오라클 에러 ORA-01950: 테이블스페이스 권한이 없습니다. (0) | 2020.06.22 |
---|---|
[ORACLE]계층형 쿼리 Hierarchical Query (0) | 2020.05.19 |
[DB][oracle] 함수 Function (0) | 2019.01.08 |
[DB] 뷰 VIEW table (0) | 2019.01.08 |
[DB][oracle] 프로시저 Procedure (0) | 2019.01.08 |