* 옵티마이저 (optimizer)
SQL쿼리를 실행할 때 가장 효율적인 처리 경로를 생성해주는 컴포넌트
- 규칙 기반 옵티마이저 (Rule-Based Optimizer, RBO)
정해진 규칙의 우선순위에 따라 실행 방법을 결정.
=> 조인 여부, 종류 / 인덱스 여부 등
- 비용 기반 옵티마이저 (Cost-Based Optimizer, CBO)
가능한 실행 경로들 중 최소한의 비용을 가지는 경로를 선택.
=> DBMS의 통계정보 활용 (테이블, 컬럼, 인덱스, I/O, CPU성능 등)
* 참고블로그 *
https://coding-factory.tistory.com/743
* 실행계획
옵티마이저가 실행하는 작업절차
* SCAN
데이터를 읽는 작업 (접근경로 수행방식)
(MySQL 주요 테이블 스캔 방식)
* Full Table Scan
테이블의 모든 행을 처음부터 끝까지 순서대로 읽는 방식.
=> SQL에 조건이 없는 경우, 인덱스를 사용할 수 없거나, 인덱스 사용이 비효율적인 경우
* Index Scan
특정 조건에 맞는 행을 찾기 위해 인덱스를 사용하는 방식.
=> 특정 조건에 맞는 데이터를 찾을 때 (범위 검색, 특정 값에 대한 검색)
- Index Range Scan
=> 쿼리 조건이 인덱스의 일부(특정 범위)를 대상으로 할 때 사용.
=> where절이나 join조건절, 등호 및 연산자를 사용하는 경우 ( =, <, >, BETWEEN )
=> Index Full Scan 보다 효율적.
- Index Full Scan
=> 인덱스의 모든 엔트리를 처음부터 끝까지 순차적으로 검색하는 방식
=> 특정 조건을 만족하는 모든 행을 찾기 위해 사용. (인덱스가 작을 때_ 인덱스로 접근할 수 있는 데이터가 많은 경우)
=> 테이블 전체 스캔보다 빠르지만 Index Range Scan 보다 더 많은 자원을 소모.
- Index Unique Scan
=> 유니크 인덱스나 PK를 대상으로 단일 값을 찾기 위한 방식
=> 속도가 빠르고 대상값을 찾으면 스캔 중단
- Loose Index Scan
=> 인덱스의 특정 부분만을 이용하여 조건에 부합하는 행을 찾는 방식
=> GROUP BY / DISTINCT 를 사용하는 경우
* Rowid Scan (오라클)
특정 테이블의 행에 대한 직접 접근하는 방식
( * ROWID : 테이블의 각 행을 고유하게 식별하는 특수한 값 , 행의 물리적 위치 기반, 특정 행을 빠르게 찾기 위한 식별자)
=> 인덱스를 통해 특정 행의 ROWID 를 얻고, ROWID 를 사용하여 데이터에 빠르게 접근.
* 참고블로그 *
(Full Table Scan을 타는 경우 / Rowid Scan을 타는 경우 / Index Scan을 타는 경우)
https://coding-factory.tistory.com/744
( 테이블 스캔 방식 )
https://velog.io/@jooh95/DB-Scan-%EC%A2%85%EB%A5%98-%EC%A0%95%EB%A6%AC
https://moonpiechoi.tistory.com/135
* 인덱스를 타지 않는 대표적인 쿼리들
- 함수나 연산자를 사용하는 경우
- LIKE문 검색에서 와일드카드의 위치 ( %가 앞이나 중간에 있는 경우 인덱스 활용X )
- OR절을 사용하는 경우
- NULL 값을 비교하는 경우
- 테이블 전체를 반환하는 경우
- 컬럼의 자료형이 다른 검색을 하는 경우
- IN 연산자를 사용한 검색에서 IN 목록의 개수가 많은 경우
https://dkswnkk.tistory.com/694
'Database > 공부공부' 카테고리의 다른 글
[SQL] INSERT INTO ... SELECT 구문 (Dual 테이블) (0) | 2024.10.23 |
---|---|
[MyBatis] foreach 태그 지원 옵션 (0) | 2024.03.14 |