관리 메뉴

개발노트

[ORACLE] Full Table Scan 본문

DB/Oracle

[ORACLE] Full Table Scan

YoonGwon 2022. 11. 1. 16:24

테이블의 데이터를 읽는 방식으로는 크게 Full Table Scan, Index Range Scan으로 나뉜다.  

일반적으로 Full Table Scan은 느리다고 생각되어 쓰지 않으려고 하는 경향이 있다. 하지만 DW 용도로 Database를 사용하는 경우 Full Table Scan이 필수적으로 사용되는 경우가 있다고 한다. 그래서 이번에는 Full Table Scan에 대해 공부해보려고한다.

 

FULL TABLE SCAN (FTS)

1) FTS이 발생하는 경우

상황 설명
적용 가능한 인덱스가 없는 경우 적용할 인덱스가 있지만 칼럼 가공, 연산으로 인해 인덱스 사용이 불가능할때
넓은 범위의 데이터 액세스 인덱스 처리 범위가 넓어 전체 테이블 스캔이 더 적은 비용이 들경우 Tull Table Scan을 적용할 수 있다.
소량의 테이블 액세스 HWM 내에 있는 블록이 DB_FILE_MULTIBLCOK_READ_COUNT 이내에 있다면 Full Table Scan이 일어날 수 있다.
병렬처리 액세스 병렬처리는 Full Table Scan을 더욱 효과적으로 수행하게 되므로 병렬처리로 수행되는 경우 항상 Full Table Scan을 선택한다.
힌트를 적용한 경우 Full 힌트를 사용했을 경우 Full Table Scan을 선택한다.

 

2) 테이블의 첫 번째 EXTENT무터 시작해서 HWM까지 모든 데이터를 읽어 조건에 맞는 결과를 추출하는 방식이다.

 

3) 오라클은 Full Table Scan(FTS)을 수행하는 경우 성능 보장을 위해서 가능한 여러 개의 블록을 한꺼번에 읽어 올리는 멀티 블록 I/O를 수행한다. 멀티 블록 I/O를 수행할 때마다 물리적인 I/O가 끝나기를 기다리게 되고, db file scattered read 이벤트가 발생하게 된다.

 

4) 오라클은 Full Table Scan(FTS)를 수행하는 경우에도 싱글 블록 I/O를 수행하는 경우가 있다. 이경우에는 Full Table Scan(FTS)하더라도 db file seqeuntial read 이벤트가 발생하게 된다. 

 -  Extent 경계에 도달하는 경우 / 스캔 도중에 캐시 된 블록이 있을 경우 / Chained Row 가 있는 경우

 

5) 멀티블록 I/O는 DB_FILE_MULTIBLOCKREAD_COUNT 파라미터로 지정된 값만큼 수행하게 된다.

SQL> show parameter db_file_multi

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
db_file_multiblock_read_count	     integer	 128

 

 

병렬 스캔으로 응답속도 줄이기

1) 대용량 Table의 경우 단일 프로세스의 FULL TABLE SCAN 방식은 빠른 응답속도를 얻기 힘들다.  오라클은 병렬 스캔 방식을 지원하고 있기 때문에 PARALLEL 힌트를 이용하여 FULL TABLE SCAN의 응답속도를 올릴 수 있다.

 

2) PARALLEL 힌트를 사용하는 경우 해당 TABLE의 ROWID를 기준으로 작업량을 나누어 여러 프로세스가 병렬 읽기 작업을 수행하게 된다. 

 

** Session1 = PARALLEL HINT 사용 **
SQL> select /*+ PARALLEL(B,4) */ * from test B
-> 4개의 Process를 통해서 TEST TABLE을 SCAN 하게된다

** Session2 = PARALLEL로 수행되고 있는지 확인 **
SQL> select decode(a.qcserial#,null,'PARENT','CHILD') stmt_level,
 a.sid,
 a.serial#,
 b.username,
 b.osuser,
 b.sql_hash_value,
 b.sql_address,
 a.degree,
 a.req_degree
from v$px_session a,v$session b
where a.sid=b.sid;

STMT_L	      SID    SERIAL# USERNAME		  OSUSER	       SQL_HASH_VALUE SQL_ADDRESS	   DEGREE REQ_DEGREE
------ ---------- ---------- -------------------- -------------------- -------------- ---------------- ---------- ----------
CHILD	       17      19058 LEE		  ora12 		   3650384804 000000006B64DC20		4	   4
CHILD	      133      36254 LEE		  ora12 		   3650384804 000000006B64DC20		4	   4
CHILD	      265      48320 LEE		  ora12 		   3650384804 000000006B64DC20		4	   4
CHILD		9	4284 LEE		  ora12 		   3650384804 000000006B64DC20		4	   4
PARENT	       20      62503 LEE		  ora12 		   3650384804 000000006B64DC20

 

728x90