오라클 아키텍처 (SQL실행시 내부동작, 데이터구조)

Ilhoon·2022년 2월 27일
1
post-thumbnail

image-20220227173710740

INSERT문 실행시 내부동작

1. SQL문 실행

서버프로세스

  • 구문분석

    • SQL문의 문법을 확인 (키워드 검사)

    • 테이블명, 칼럼명, 데이터 타입 확인 (의미 검사)

    • SQL문을 실행한 계정의 권한 확인 (권한 검사)

  • Shared Pool의 라이브러리캐시에 해당 쿼리 저장 (쿼리 재사용을 위해)

  • 입력할 데이터를 리두로그버퍼와 DB버퍼캐시에 기록

2. COMMIT 실행

백그라운드 프로세스

LGWR (Log writer)

  • 리두로그버퍼 데이터 -> 리두로그파일로 저장
  • DB버퍼캐시 상태 변경 (Pinned --> Dirty)
  • Checkpointer가 DBWR에게 데이터 저장 신호 전달
  • DBWR가 DB버퍼캐시 데이터 -> 데이터파일로 저장

SELECT문 실행시 내부동작

서버프로세스

  • 구문분석

    • SQL문의 문법을 확인 (키워드 검사)

    • 테이블명, 칼럼명, 데이터 타입 확인 (의미 검사)

    • SQL문을 실행한 계정의 권한 확인 (권한 검사)

    • 라이브러리캐시에 SQL 존재하는지 확인

      • 있으면 곧바로 실행 (소프트 파싱)

        • bind변수만 달라졌을 경우 소프트 파싱
      • 없으면 옵티마이저가 최적화 과정을 거쳐 실행계획 생성 (하드 파싱)

        • 테이블, 인덱스, 칼럼에 대한 통계정보 존재하는지 확인

        • 인덱스가 존재한다면 어떤 인덱스가 최적인지

        • CPU를 많이 소모하는 작업

  • Shared Pool의 라이브러리 캐시에 쿼리와 실행계획 저장 (쿼리 재사용을 위해서)

  • DB버퍼캐시에 해당 테이블의 데이터 있는지 확인

    • 있으면 캐시에서 데이터 접근 (메모리 I/O)
    • 없으면 디스크에 접근해서 해당 테이블 데이터를 DB버퍼캐시로 복사 (디스크 I/O)
  • DB버퍼캐시의 데이터 중 원하는 결과만 추출하여 유저프로세스로 전송 (블록 단위)

SELECT문 논리적 실행순서

  • FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY


UPDATE문 실행시 내부동작

1. SQL문 실행

서버프로세스

  • 구문분석

    • SQL문의 문법을 확인 (키워드 검사)

    • 테이블명, 칼럼명, 데이터 타입 확인 (의미 검사)

    • SQL문을 실행한 계정의 권한 확인 (권한 검사)

  • Shared Pool의 라이브러리캐시에 해당 쿼리 저장 (쿼리 재사용을 위해)

  • DB버퍼캐시에 해당 테이블의 데이터 있는지 확인

    • 없으면 디스크에 접근해서 해당 테이블 데이터를 DB버퍼캐시로 복사
    • DB버퍼캐시에 변경 조건에 맞게 데이터 수정
  • 입력할 데이터를 리두로그버퍼와 DB버퍼캐시에 기록

2. COMMIT 실행

백그라운드 프로세스

  • 리두로그버퍼 데이터 -> 리두로그파일로 저장
  • DB버퍼캐시 상태 변경 (Pinned --> Dirty)
  • Checkpointer가 DBWR에게 데이터 저장 신호 전달
  • DBWR가 DB버퍼캐시 데이터 -> 데이터파일로 저장

용어 설명

리두로그버퍼

  • 오라클은 갑작스러운 장애 발생시 백업된 데이터파일에 리두로그버퍼를 합쳐서 데이터를 복구한다.

  • 리두로그버퍼에서 리두로그파일로 저장되는 시점

DB버퍼캐시

버퍼상태

  • Pinnded 버퍼 : 현재 사용중인 버퍼, 변경을 했지만 아직 COMMIT은 되지 않은 상태

  • Dirty 버퍼 : COMMIT을 했지만 아직 데이터파일로 저장은 되지 않은 상태

    • 리두로그파일에는 저장되었지만 데이터파일에는 저장안된 상태
  • Free 버퍼 : 사용가능한 버퍼, 데이터가 데이터파일로 저장되었거나 사용되지 않은 상태

DB버퍼캐시의 데이터가 데이터파일로 저장되는 경우

  • Checkpoint 신호가 발생했을 때
  • DDL명령이 실행될 때

Shared Pool

라이브러리캐시

  • 파싱된 SQL문과 실행계획을 매핑하여 저장
  • 캐시 공간이 부족하면 버려졌다가 다시 하드파싱 후 저장된다.

딕셔너리캐시

  • 오라클의 모든 객체(테이블, 뷰, 인덱스, 시퀀스 등)에 대한 정보들을 저장
  • 테이블 데이터를 찾을 때 그 시작점이 된다.

데이터 저장구조

테이블 스페이스 : 세그먼트를 담는 콘테이너

세그먼트 : 데이터 저장공간이 필요한 오브젝트 (테이블, 인덱스, 파티션 등)

익스텐트 : 공간을 확장하는 단위, 연속된 블록 집합

블록 : 데이터를 읽고 쓰는 단위

데이터 파일 : 디스크 상의 물리적인 OS 파일

image-20220227174302683

profile
꾸준하게!

0개의 댓글