본문 바로가기

DB/이론

[ Full Table Scan ] vs [ Index Scan ]

DDL 공부하려다가 INDEX에 관한 글을 보고 여기를 먼저왔다.

 

1) 전체 테이블 스캔 ( Full Table Scan )

 

High Water Mark

 

● 테이블에 존재하는 모든 데이터를 읽어 가면서 조건에 맞으면 결과로서 추출하고 조건에 맞지 않으면

   버리는 방식이다.

 

● Oracle의 경우, 테이블의 고수위 마크(HWM, High Water Mark) 아래의 모든 블록을 읽는다.

고수위 마크(HWM) : 테이블에 데이터가 쓰여졌던 블록 상의 최상위 위치

 

● 위 그림과 같이 일반적으로 블록들은 서로 인접되어 있기 때문에, Full Table Scan은 한 번의 I/O에 여러

   블록을 옮겨온다. 즉, 한 번의 I/O에 데이터를 다중 블록 단위로 메모리에 가져오기 때문에, Row당 소요되는

   입출력 비용이 인덱스 캔에 비해 적다. 메모리에 옮겨진 블록들은 순차적으로 읽힌다.

 

옵티마이저가 전체 테이블 스캔을 선택하는 경우는 언제일까?

 

1) 인덱스가 없을 경우2) 넓은 범위의 데이터 액세스 : 스캔 범위가 넓으면 풀 스캔이 효율적이다.3) 병렬처리 액세스 : DB도 여러 쓰레드를 사용해서 병렬적으로 처리할 수 있다.4) 'FULL' 힌트를 적용한 경우 : Full 힌트를 사용했을 때인데 Full힌트가 적절하지 않다면 옵티마이저는 이를 무시할 수 있다.

 

 

1) 인덱스 스캔 ( Index Scan )

● 인덱스(Index)를 구성하는 칼럼의 값을 기반으로 데이터를 추출하는 액세스 기법이다.

 

인덱스에 존재하지 않는 칼럼의 값이 필요한 경우에는 현재 읽은 레코드 식별자를 이용하여 테이블을 액세스해야 한다. 그러나 SQL문에서 필요로 하는 모든 칼럼이 인덱스 구성 칼럼에 포함된 경우 테이블에 대한 액세스는 발생하지 않는다.

 

● 인덱스의 구성 칼럼이 A+B라면 먼저 칼럼 A로 정렬되고 칼럼 A의 값이 동일할 경우에는 칼럼 B로 정렬된다.

    그리고 칼럼 B까지 모두 동일하면 레코드 식별자로 정렬된다.

 

인덱스가 구성 칼럼으로 정렬되어 있기 때문에 인덱스를 경유하여 데이터를 읽으면 그 결과 또한 정렬되어 반환됨.

    따라서 인덱스의 순서와 동일한 정렬 순서를 사용자가 원하는 경우에는 정렬 작업을 하지 않을 수 있다.

 

'DB > 이론' 카테고리의 다른 글

Oracle - INDEX  (0) 2024.06.22
인덱스(Index) Re  (0) 2024.06.21
VARCHAR, CHAR  (0) 2024.06.21
DDL, DML, DCL  (0) 2024.06.18
GROUP BY, DISTINCT  (2) 2024.06.18