■ full table scan
- 많은 양의 데이터 검색 시 유용함.
-> 기준 : 첫번째 블록부터 마지막 사용한 블록 (High Water Mark, 5배수단위로 조정) 까지 읽어오는 방식
- Multi Block I/O 발생한다.(여러 블록을 읽어 들인다)
--> 기준 : show parameter db_file_multiblock_read_count 으로 확인
show parameter db_file_multiblock_read_count
=> VALUE의 갯수만큼 block이 한꺼번에 움직임.
- 한번에 i/o call 방식할 때,db_file_multiblock_read_count 설정되어 있는 블록 수 만큼 읽어 들이기 위해서는 extent 안에 db_file_multiblock_read_count 설정되어 있는 갯수 만큼 있을 경우 나름 멀티 블록 i/o 성능이 좋을 수 있다.
- 'db file scattered read' wait event 발생 할 수 있다. (원인: sql 문장 -> sql 튜닝)
(해석: 떨어져 있는 블록들을 읽고 있다.) --> v$session 테이블은 필수의 모니터링
=> full table scan 으로 인해서 과도한 multi block i/o 발생 시
<hr sess_1>
create table hr.emp as select * from hr.employees;
#) 실행계획 보기위한 명령어
set autot traceonly exp
#) 해당 select문의 실행계획
select * from hr.emp where employee_id = 100;
1 - filter("EMPLOYEE_ID"=100) => 해당 위치를 알 수 없으니까, 값을 찾을 때까지 EMP에서 full scan
※ (어쩔수 없이 상황이라면) full table scan 속도를 개선하기 위한 방법
1. 병렬 작업(parallel 또는 parallel_index 힌트를 사용)
(=: database/디스크 → data buffer cache를 덜 건드리고/redo 용량↓ → PGA/cursor 로 다이렉트하게 와서 결과값을 출력하는 방법)
2. 'db_file_multiblock_read_count' parameter의 값을 조정한다.
<sys sess>
#) db_file_multiblock_read_count 변경
alter session set db_file_multiblock_read_count=128;
select /*+ full(e) parallel(e,2) */ * from emp e;
-> index를 하지 못하게 함. -> parallel 만 적용하게 되면 멀티 블록뿐만 아니라 싱글 블록도 진행될 수 있다. + index도 추가되는 문제 발생.
■ rowid scan
- user rowid, index rowid를 이용하여 소량의 데이터 검색 시 유용하다.
- single block I/O 수행
- db file sequential read 대기 이벤트 발생할 수 있다.
SELECT
employee_id,
ROWID,
dbms_rowid.rowid_object(rowid) as data_object_id,
dbms_rowid.rowid_relative_fno(rowid) as file_no,
dbms_rowid.rowid_block_number(rowid) as block_no,
dbms_rowid.rowid_row_number(rowid) as row_slot_no
FROM hr.emp;
#) rowid 를 통해서 row slot 확인
SELECT
employee_id,
ROWID,
dbms_rowid.rowid_object(rowid) as data_object_id,
dbms_rowid.rowid_relative_fno(rowid) as file_no,
dbms_rowid.rowid_block_number(rowid) as block_no,
dbms_rowid.rowid_row_number(rowid) as row_slot_no
FROM hr.emp
WHERE employee_id = 100;
#) 실행계획 확인
--> rowid scan 으로 실행계획 보기, single block
set autot traceonly exp
select * from hr.emp where rowid = 'AAAVxJAAEAAAEsLAAJ';
'Data Base > SQL 튜닝' 카테고리의 다른 글
Explain Plan, 실행계획 (1) | 2024.02.14 |
---|---|
index scan (1) | 2024.02.10 |
TX LOCK ⓒ 변경하고자 하는 블록의 ITL에 트랜잭션 엔트리를 등록하고자 하는 경우 (1) | 2024.02.10 |
TX LOCK ⓑ 특정 행에 unique key, primary key 에 해당하는 데이터를 입력, 수정하는 경우 (0) | 2024.02.10 |
TX LOCK ⓐ 특정 행을 변경하고자 하는 경우 (0) | 2024.02.10 |