IT/SQLD(SQL개발자)

[SQLD] 옵티마이저와 테이블 스캔

pandada 2019. 7. 4. 17:47
반응형

옵티마이저와 테이블 스캔

 

 

옵티마이저  

  - 사용자가 질의한 SQL문에 대해 최적의 실행 방법을 결정하는 역할을 수행

  - 다양한 실행 방법들 중에서 최적의 실행 방법을 결정하는 것이 옵티마이저의 역할임.

  - 관계형 DB는 옵티마이저가 셜정한 실행 방법대로 실행 엔진이 데이터를 처리하여 결과 데이터를 사용자에게 전달하는 역할을 할 뿐이다.

  - 최적의 실행방법( 어던 방법으로 처리하는 것이 최소 일량으로 동일한 일을 처리할 수 있는지 )

 

 

 규칙기반 옵티마이저 

  - 규칙(우선 순위)을 가지고 실행계획을 생성한다.

 

규칙기반 옵티마이저의 규칙(15가지 순서)

순위 

엑세스 기법 

규칙 설명 

Single row by rowid 

 Rowid를 통해서 테이블에서 하나의 행을 액세스 하는 방식, Rowid는 행이 포함된 데이터 파일, 블록 등의 정보를 가지고 있기 때문에 다른 정보를 참조하지 않고도 바로 원하는 행을 액세스 할 수 있다. 

 하나의 행을 액세스 하는 가장 빠른 방법 

Single row by cluster join 

 

Single row by hash cluster key with unique or primary key 

 

Single row by unique or primary key 

 유일 인덱스를 통해서 하나의 행을 액세스 하는 방식

 인덱스를 먼저 액세스하고 인덱스에 존재하는 Rowid를 추출하여 테이블의 행을 액세스 한다. 

 5

Cluster join 

 

Hash cluster key 

 

Indexed cluster key 

 

Composite index 

 복합 인덱스에 동등조건으로 검색하는 경우. 

 인덱스 구성 칼럼의 개수가 더 많고 해당 인덱스의 모든 구성 칼럼에 대해 "="로 값이 주어질수록 우선 순위가 더 높다. 

Single column index 

 단일 칼럼 인덱스에 "=" 조건으로 검색하는 경우 

10 

Bounded range search on indexed columns 

 인덱스가 생성되어 있는 칼럼에 양쪽 범위를 한정하는 형태로 검색하는 방식 

11 

Unbonded range search on indexed column

 인덱스가 생성되어 있는 칼럼에 한쪽 범위만 한정하는 형태로 검색하는 방식 

12 

Sort merge join 

 

13 

Max or Min of indexed column 

 

14 

Order by on indexed column 

 

15 

Full table scan 

 전체 테이블을 액세스하면서 조건절에 주어진 조건을 만족하는 행만을 결과로 추출한다. 

Add.

  - 규칙기반 옵티마이저는 인덱스를 이용한 액세스 방식이 전체 테이블 액세르 방식보다 우선순위가 높다. 

 

 

비용기반 옵티마이저  

  - 규칙기반 옵티마이저의 단점을 보완하기위해 출현.

  - SQL문을 처리하는데 필요한 비용이 가장 적은 실행계획을 선택하는 방식.

  - 비용을 예측하기 위해서 규칙기반 옵티마이저가 사용하지 않는 테이블, 인덱스, 칼럼 등의 다양한 객체 통계정보와 시스템 통계정보 등을 이용한다.

 

비용기반 옵티마이저의 구성 요소 및 단계별 특징

< 비용기반 옵티마이저의 구성 요소 및 단계별 특징 >

구성 요소 

설명 

 대안 계획 생성기 

 - 동일한 결과를 생성하는 다양한 대안 계획을 생성하는 모듈 

 - 대안 계획은 연산의 적용 순서 변경, 연산 방법 변경, 조인 순서 변경 등을 거쳐서 생성된다.

 - 동일한 결과를 생성하는 가능한 모든 대안 계획을 생성해야 보다 나은 최적화를 할 수 있다. 그러나 대안 계획의 생성이 너무 많아지면 최적화를 수행하는 시간이 그만큼 오래 걸릴 수 있다.

 - 대부분의 사용옵티마이저들은 대안 계획의 수를 제약하는 방법을 사용한다.

 비용 예측기 

 - 대안 계획 생성기에 의해서 생성된 대안 계획의 비용을 예측하는 모듈

 - 대안 계획의 정확한 비용을 예측하기 위해서 연산의 중간 집합의 크기 및 결과 집합의 크기, 분포도 등의 예측이 정확해야 한다. 

Add.

  - 규칙기반 옵티마이저는 항상 인덱스를 사용할 수 있다면 전체 테이블 스캔보다는 인덱스를 사용하는 실행 계획을 생성한다.

  - 비용기반 옵티마이저는 인덱스를 사용하는 비용이 전체 테이블 스캔 비용보다 크다고 판단되면 전체 테이블 스캔을 수행하는 방법으로 실행계획을 생성할 수도 있다.

 

 

실행 계획 

  - SQL에서 요구한 사항을 처리하기 위한 절차와 방법을 의미.

  - 실행 계획을 생성한다는 것은 SQL을 어떤 순서로 어떻게 실행할 지를 결정하는 작업이다.

  - 생성된 실행계획을 보는 방법은 DB 벤더마다 서로 다르다.

 

 

인덱스 특징과 종류 

  - 원하는 데이터를 쉽게 찾을 수 있도록 돕는 책의 찾아보기와 유사한 개념

  - 테이블을 기반으로 선택적으로 생성할 수 있는 구조.

  - 테이블에 인덱스를 생성하지 않아도 되고 여러 개를 생성해도 됨

  - 인덱스의 목적은 검색 성능의 최적화(검색 조건을 만족하는 데이터를 인덱스를 통해 효과적으로 찾을 수 있도록 돕는다.)

  - But Insert, Delete, Update 등과 같은 DML 작업은 테이블과 인덱스를 함께 변경해야 하기 때문에 오히려 느려질 수 있다는 단점이 존재한다. 

* 트리 기반 인덱스

  - DBMS에서 가장 일반적인 인덱스는 B-트리 인덱스이다.

 

B-트리 인덱스

< B-트리 인덱스 >

Leaf Block 추가 설명 

 인덱스를 구성하는 칼럼의 데이터와 해당 데이터를 가지고 있는 행의 위치가 가리키는 레코드 식별자로 구성되어 있다. 

 인덱스 데이터는 인덱스를 구성하는 칼럼의 값으로 정렬된다. 

 인덱스 데이터의 값이 동일하면 레코드 식별자의 순서로 저장된다. 

 양방향 링크를 가지고 있다.

 

인덱스에서 원하는 값을 찾는 과정 

 1. 브렌치 블록의 가장 왼쪽 값이 찾고자 하는 값보다 작거나 같으면 왼쪽으로 포인터 이동  

 2. 찾고자 하는 값이 브렌치 블록의 값 사이에 존재하면 가운데 포인터로 이동 

 3. 오른쪽에 있는 값보다 크면 오른쪽 포인터로 이동 

 

 

* 클러스터형 인덱스(SQL server)

  - 인덱스의 Leaf Page가 곧 Data Page이다. Then. 테이블 탐색에 필요한 레코드 식별자가 Page에 없다.

  - Leaf Page의 모든 Row는 인덱스 키 칼럼 순으로 물리적으로 정렬되어 저장된다.

  - Table Row는 물리적으로 한 가지 순서로만 정렬될 수 있다. Then. 클러스터형 인덱스는 테이블당 한 개만 생성할 수 있다.

 

 

 

전체 테이블 스캔과 인덱스 스캔  

   * 전체 테이블 스캔

    - 테이블에 존재하는 모든 데이터를 읽어 가면서 조건에 맞으면 결과로서 추출하고 조건에 맞지 않으면 버리는 방식으로 검색.

    - 테이블의 고수위 마크(테이블에 데이터가 쓰여졌던 Block 상의 최상위 위치) 아래의 모든 Block을 reading.

 

  옵티마이저가 연산으로서 전체 테이블 스캔 방식을 선택하는 이유

    - SQL문에 조건이 존재하지 않는 경우

    - SQL문의 주어진 조건에 사용 가능하나 인덱스가 존재하지 않는 경우

    - 옵티마이저의 취사 선택

    - 그 밖의 경우

 

   * 인덱스 스캔

    - 인덱스를 구성하는 칼럼의 값을 기반으로 데이터를 추출하는 액세스 기법

    - Leaf of Index Scan은 인덱스를 구성하는 칼럼의 값을 기반으로 데이터를 추출하는 액세스 기법.

    - 검색을 위해 인덱스의 리프 블록을 읽으면 인덱스 구성 칼럼의 값과 테이블의 레코드 식별자를 알 수 있다.

   

 인덱스 스캔의 종류 

스캔 종류 

설명 

인덱스 유일 스캔 

 - 유일 인덱스를 사용하여 단 하나의 데이터를 추출하는 방식

 - 유일 인덱스 구성 칼럼에 모두 "="로 값이 주어지면 결과는 최대 1건

 - 구성 칼럼에 대해 모두 "="로 값이 주어진 경우에만 가능한 스캔 방식 

인덱스 범위 스캔 

 - 인덱스를 이용하여 한 건 이상의 데이터를 추출하는 방식

 - 유일 인덱스의 구성 칼럼 모두에 대해 "="로 값이 주어지지 않은 경우와 비유일 인덱스를 이용하는 모든 액세스 방식은 인덱스 범위 스캔 방식으로 데이터를 액세스 하는 것 

인덱스 역순 스캔 

 - 인덱스의 리프 블록의 양방향 링크를 이용하여 내림 차순으로 데이터를 읽는 방식

 - 최대값을 쉽게 찾을 수 있다. 

Arrangement.

인덱스 스캔 방식

- 사용 가능한 적절한 인덱스가 존재할 때만 이용할 수 있는 스캔 방식.

- 인덱스에 존재하는 레코드 식별자를 이용해서 검색하는 데이터의 정확한 위치를 알고서 데이터를 읽는다.

- 한번 I/O 요청에 한 블록씩 데이터를 읽는다.

- 대용량 데이터 중에서 극히 일부의 데이터를 찾을 때 이용한다.

 

전체 테이블 스캔방

- 인덱스의 존재 유무와 상관없이 항상 이용 가능한 스캔 방식.

- 데이터를 읽을 때 한번의 I/O요청으로 여러 블록을 한꺼번에 읽는다.

- 테이블의 대부분의 데이터를 찾을때 이용한다.

 

 

반응형