본문 바로가기

Database/공부공부

[DB기초] 옵티마이저, 테이블 스캔 방식

 

* 옵티마이저 (optimizer)

SQL쿼리를 실행할 때 가장 효율적인 처리 경로를 생성해주는 컴포넌트 

 

 - 규칙 기반 옵티마이저 (Rule-Based Optimizer, RBO)

정해진 규칙의 우선순위에 따라 실행 방법을 결정. 

=> 조인 여부, 종류 / 인덱스 여부 등

 

 - 비용 기반 옵티마이저 (Cost-Based Optimizer, CBO)

가능한 실행 경로들 중 최소한의 비용을 가지는 경로를 선택.

 => DBMS의 통계정보 활용 (테이블, 컬럼, 인덱스, I/O, CPU성능 등)

 


* 참고블로그 * 

https://coding-factory.tistory.com/743

 

[DB] 데이터베이스 옵티마이저(Optimizer)에 대하여

옵티마이저(Optimizer)란? 옵티마이저는 가장 효율적인 방법으로 SQL을 수행할 최적의 처리 경로를 생성해주는 DBMS의 핵심 엔진입니다. 컴퓨터의 두뇌가 CPU인 것처럼 DBMS의 두뇌는 옵티마이저라고

coding-factory.tistory.com

 


 

* 실행계획

옵티마이저가 실행하는 작업절차

 

* 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

 

[DB] 데이터베이스 실행 계획에 대하여

실행 계획이란? 실행계획이란 사용자가 SQL을 실행하여 데이터를 추출하려고 할 때 옵티마이저가 수립하는 작업 절차입니다. 이렇게 만들어진 실행 계획은 여러 가지 방법을 통해 확인할 수 있

coding-factory.tistory.com

 

( 테이블 스캔 방식 )

https://velog.io/@jooh95/DB-Scan-%EC%A2%85%EB%A5%98-%EC%A0%95%EB%A6%AC

 

[DB] 테이블 데이터 스캔 방식 및 디스크 접근 정리

테이블 데이터 스캔 방식 및 디스크 접근 정리

velog.io

 

https://moonpiechoi.tistory.com/135

 

[SQL] 전체 테이블 스캔, 인덱스 스캔

전체 테이블 스캔 테이블에 존재하는 모든 데이터를 읽으면서 조건에 맞으면 결과로 추출하고, 조건에 맞지 않으면 버리는 방식 모든 결과를 찾을 때까지 시간이 오래 걸릴 수 있다. 옵티마이저

moonpiechoi.tistory.com

 


 

* 인덱스를 타지 않는 대표적인 쿼리들

 - 함수나 연산자를 사용하는 경우
 - LIKE문 검색에서 와일드카드의 위치 ( %가 앞이나 중간에 있는 경우 인덱스 활용X )
 - OR절을 사용하는 경우
 - NULL 값을 비교하는 경우
 - 테이블 전체를 반환하는 경우
 - 컬럼의 자료형이 다른 검색을 하는 경우
 - IN 연산자를 사용한 검색에서 IN 목록의 개수가 많은 경우  

 

https://dkswnkk.tistory.com/694

 

인덱스를 안타는 쿼리들

인덱스란? 인덱스(Index)는 데이터베이스에서 데이터 검색 속도를 향상하기 위한 자료구조입니다. 인덱스는 데이터베이스에서 데이터를 찾는 데 사용되며, 색인이라고도 합니다. 인덱스는 주로 W

dkswnkk.tistory.com