SQL 수행 아키텍처(INSERT, SELECT, UPDATE)
INSERT문 실행 시 내부동작
→ SQL문 실행
1. 서버프로세스
● 구문분석
○ SQL문의 문법을 확인(키워드 검사)
○ 테이블명, 컬럼명, 데이터 타입 확인(의미 검사)
○ SQL문을 실행한 계정의 권한 확인(권한 검사)
● Shared Pool의 라이브러리 캐시에 해당 쿼리 저장(쿼리 재사용 위해)
● 입력할 데이터를 리두로그버퍼와 DB버퍼캐시에 기록
2. COMMIT 실행
● 백그라운드 프로세스
LGWR (Log Writer)
○ 리두로그버퍼 데이터 → 리두로그파일로 저장
○ DB버퍼캐시 상태 변경 (Pinned --> Dirty)
○ Checkpointer가 DBWR에게 데이터 저장 신호 전달
○ DBWR가 DB버퍼캐시 데이터 --> 데이터파일로 저장
SELECT문 실행 시 내부동작
→ SQL문 실행
1. 서버프로세스
● 구문분석
○ SQL문의 문법을 확인(키워드 검사)
○ 테이블명, 컬럼명, 데이터 타입 확인(의미 검사)
○ SQL문을 실행한 계정의 권한 확인(권한 검사)
○ 라이브러리캐시에 SQL 존재하는지 확인
■ 있으면 곧바로 실행(소프트 파싱)
■ bind변수만 달라졌을 경우 소프트 파싱
■ 없으면 옵티마이저가 최적화 과정을 거쳐 실행계획 생성(하드 파싱)
■ 테이블, 인덱스, 컬럼에 대한 통계정보 존재하는지 확인
■ 인덱스가 존재한다면 어떤 인덱스가 최적인지
■ CPU를 많이 소모하는 작업
● Shared Pool의 라이브러리 캐시에 해당 쿼리와 실행계획 저장(쿼리 재사용 위해)
● DB버퍼캐시에 해당 테이블의 데이터 있는지 확인
○ 있으면 캐시에서 데이터 접근(메모리 I/O)
○ 없으면 디스크에 접근해서 해당 테이블 데이터를 DB버퍼캐시로 복사(디스크 I/O)
● DB버퍼캐시의 데이터 중 원하는 결과만 추출하여 유저 프로세스로 전송(블록 단위)
● SELECT문 논리적 실행 순서
○ FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
UPDATE문 실행 시 내부동작
→ SQL문 실행
1. 서버프로세스
● 구문분석
○ SQL문의 문법을 확인(키워드 검사)
○ 테이블명, 컬럼명, 데이터 타입 확인(의미 검사)
○ SQL문을 실행한 계정의 권한 확인(권한 검사)
● Shared Pool의 라이브러리 캐시에 해당 쿼리와 실행계획 저장(쿼리 재사용 위해)
● DB버퍼캐시에 해당 테이블의 데이터 있는지 확인
○ 없으면 디스크에 접근해서 해당 테이블 데이터를 DB버퍼캐시로 복사(디스크 I/O)
○ DB버퍼캐시에 변경 조건에 맞게 데이터 수정
● 입력할 데이터를 리두로그버퍼와 DB버퍼캐시에 기록
2. COMMIT 실행
● 백그라운드 프로세스
LGWR (Log Writer)
○ 리두로그버퍼 데이터 → 리두로그파일로 저장
○ DB버퍼캐시 상태 변경 (Pinned --> Dirty)
○ Checkpointer가 DBWR에게 데이터 저장 신호 전달
○ DBWR가 DB버퍼캐시 데이터 --> 데이터파일로 저장
용어 설명
리두로그버퍼
● 오라클은 갑작스러운 장애 발생시 백업된 데이터파일에 리두로그버퍼를 합쳐서 데이터를 복구한다.
● 리두로그버퍼에서 리두로그파일로 저장되는 시점
DB버퍼캐시
● Pinnded 버퍼 : 현재 사용중인 버퍼, 변경을 했지만 아직 COMMIT은 되지 않은 상태
● Dirty 버퍼 : COMMIT을 했지만 아직 데이터파일로 저장은 되지 않은 상태
○ 리두로그파일에는 저장되었지만 데이터파일에는 저장이 되지 않은 상태
● Free 버퍼 : 사용가능한 버퍼, 데이터가 데이터파일로 저장되었꺼나 사용되지 않은 상태
DB버퍼캐시의 데이터가 데이터파일로 저장되는 경우
● Checkpoint 신호가 발생했을 때
● DDL명령이 실행될 때
Shared Pool
라이브러리캐시
● 파싱된 SQL문과 실행계획을 매핑하여 저장
● 캐시 공간이 부족하면 버려졌다가 다시 하드파싱 후 저장된다.
딕셔너리캐시
● 오라클의 모든 객체(테이블, 뷰, 인덱스, 시퀸스 등)에 대한 정보들을 저장
● 테이블 데이터를 찾을 때 그 시작점이 된다.
소프트파싱과 하드파싱
데이터 저장구조
테이블 스페이스 : 세그먼트를 담는 컨테이너
세그먼트 : 데이터 저장공간이 필요한 오브젝트(테이블, 인덱스, 파티션 등)
익스텐트 : 공간을 확장하는 단위, 연속된 블록 집합
블록 : 데이터를 읽고 쓰는 단위
데이터 파일 : 디스크 상의 물리적인 OS 파일