Data Base/SQL 튜닝

full table scan, rowid scan

잇꼬 2024. 2. 10. 23:26
728x90
반응형
SMALL

■ 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';

728x90
반응형
LIST