이 문서는 왼쪽에 보이는, 오라클 성능 고도화 원리와 해법 I (조시형 저, (주)비투엔컨설팅, 2009)라는 책을 기반으로 하여, 개인적으로 공부하며 정리해나간 내용들을 담고 있습니다.
2010년 가을에 정리했었던 내용으로, 당시에는 아직 거의 신입 dba나 다름없던 시기였으며, 아무것도 모르면서 정리했던 내용들이 되겠습니다. 
그냥 혼자 공부하며 텍스트 파일에 대충 정리했었던 내용이었는데, 위키를 새로 개설하며 컨텐츠가 부족하여...-_-;; 구글에 조금이라도 더 잘 검색되기를 바라며 채워 넣은 내용이라, 상당히 부실할 것입니다. 
이제부터는 이 내용들을 기반으로 점차 위키에 등록한 내용들을 수정해나가려고 합니다. 
아직은 많이 부족한 내용이니 그점 감안하여 참조하시기 바라며, 좀더 자세한 내용이 필요하시다면, 제가 참조한 '오라클 성능 고도화 원리와 해법 I'책을 보시면 될 것입니다.

 

오라클 아키텍처

기본 아키텍처

DB 버퍼 캐시

  • 블록 단위 I/O
  • 버퍼 캐시 구조
  • 캐시 버퍼 체인
  • 캐시 버퍼 LRU 체인

버퍼 Lock

  • 버퍼 Lock이란?
  • 버퍼 핸들
  • 버퍼 Lock의 필요성
  • 버퍼 Pinning

Redo

Undo

  • Undo 세그먼트 트랜잭션 테이블 슬롯
  • 블록 헤더 ITL 슬롯
  • Lock Byte

문장수준 읽기 일관성

  • 문장수준 읽기 일관성이란?
  • Consistent 모드 블록 읽기
  • Consistent 모드 블록 읽기의 세부원리

Consistent vs. Current 모드 읽기

  • Consistent 모드 읽기와 Current 모드 읽기의 차이점
  • Consistent 모드로 갱신할 때 생기는 현상
  • Current 모드로 갱신할 때 생기는 현상
  • Consistent 모드로 읽고, Current 모드로 갱신할 때 생기는 현상
  • Consistent 모드로 갱신대상을 식별하고, Current 모드로 갱신
  • 오라클에서 일관성 없게 값을 갱신하는 사례

블록 클린아웃

  • Delayed 블록 클린아웃
  • 커밋 클린아웃(=Fast 블록 클린아웃)
  • ITL과 블록 클린아웃

Snapshot too old

  • Undo 실패
  • 블록 클린아웃 실패
  • Snapshot too old 회피 방법

대기 이벤트

  • 대기 이벤트란?
  • 대기 이벤트는 언제 발생할까?
  • 대기 이벤트는 언제 사라질까?
  • 래치와 대기 이벤트 개념 명확화

Shared Pool

  • 딕셔너리 캐시
  • 라이브러리 캐시


트랜잭션과 Lock

트랜잭션 동시성 제어

  • 동시성 제어
  • 트랜잭션이란?
  • 트랜잭션의 특징(ACID)

트랜잭션 수준 읽기 일관성

  • 트랜잭션 수준 읽기 일관성이란?
  • 트랜잭션 고립화 수준
  • Dirty Read(=Uncommitted Dependency)
  • Non-Repeatable Read(=Inconsistent Analysis)
  • Phantom Read

비관적 vs. 낙관적 동시성 제어

  • 비관적 동시성 제어
  • 낙관적 동시성 제어

동시성 구현 사례

  • 일련번호 채번 동시성 높이기
  • 선분이력 정합성 유지

오라클 Lock

  • Enqueue Lock
  • TX Lock(=트랜잭션 Lock)
  • TX Lock → 무결성 제약 위배 가능성 또는 비트맵 인덱스 엔트리 갱신
  • TX Lock → ITL 슬롯 부족
  • TX Lock → 인덱스 분할
  • TX Lock → 기타 트랜잭션 Lock
  • TX Lock → DML 로우 Lock
  • TX Lock → DML 테이블 Lock
  • Lock을 푸는 열쇠, 커밋


오라클 성능관리

Explain Plan

AutoTrace

SQL 트레이스

  • 자기 세션에 트레이스 걸기
  • 다른 세션에 트레이스 걸기
  • Service, Module, Action 단위로 트레이스 걸기

DBMS_XPLAN 패키지

  • 예상 실행계획 출력
  • 캐싱된 커서의 실제 실행계획 출력
  • 캐싱된 커서의 Row Source별 수행 통계 출력

V$SYSSTAT

  • 시스템 수행통계 수집 및 분석
  • Ratio 기반 성능 분석

V$SYSTEM_EVENT

Response Time Analysis 방법론과 OWI

Statspack / AWR

  • Statspack / AWR 기본 사용법
  • Statspack / AWR 리포트 분석

ASH(Active Session History)

V$SQL

End-To-End 성능관리

데이터베이스 성능 고도화 정석 해법


라이브러리 캐시 최적화 원리

SQL과 옵티마이저

SQL 처리과정

  • SQL 파싱
  • SQL 최적화
  • Row-Source Generation

라이브러리 캐시 구조

커서 공유

  • 커서란?
  • 커서 공유
  • Child 커서를 공유하지 못하는 경우
  • Parent 커서를 공유하지 못하는 경우

바인드 변수의 중요성

바인드 변수의 부작용과 해법

  • 바인드 변수 Peeking
  • 적응적 커서 공유
  • 입력 값에 따라 SQL분리
  • 예외적으로, Literal 상수 값 사용

세션 커서 캐싱

애플리케이션 커서 캐싱

Static vs. Dynamic SQL

  • Static SQL
  • Dynamic SQL
  • 일반 프로그램 언어에서 SQL 작성법
  • 문제의 본질은 바인드 변수 사용 여부

Dynamic SQL 사용 기준

  • Dynamic SQL 사용에 관한 기본 원칙
  • 기본 원칙이 잘 지켜지지 않는 첫 번째 이유, 선택적 검색 조건
  • 선택적 검색 조건에 대한 현실적인 대안
  • 선택적 검색 조건에 사용할 수 있는 기법 성능 비교

Static SQL 구현을 위한 기법들

  • IN-List 항목이 가변적이지만 최대 경우 수가 적은 경우
  • IN-List 항목이 가변적이고 최대 경우 수가 아주 많은 경우
  • 체크 조건 적용이 가변적인 경우
  • select-list가 동적으로 바뀌는 경우
  • 연산자가 바뀌는 경우


데이터베이스 Call 최소화 원리

Call 통계

User Call vs. Recursive Call

데이터베이스 Call이 성능에 미치는 영향

Array Processing 활용

Fetch Call 최소화

  • 부분범위처리 원리
  • OLTP 환경에서 부분범위처리에 의한 성능개선 원리
  • ArraySize 조정에 의한 Fetch Call 감소 및 블록 I/O 감소 효과
  • 프로그램 언어에서 Array 단위 Fetch 기능 활용

페이지 처리의 중요성

PL/SQL 함수의 특징과 성능 부하

  • PL/SQL 함수의 특징
  • Recursive Call를 포함하지 않는 함수의 성능 부하
  • Recursive Call를 포함하는 함수의 성능 부하
  • 함수를 필터 조건으로 사용할 때 주의 사항
  • 함수와 읽기 일관성
  • 함수의 올바른 사용 기준

PL/SQL 함수 호출 부하 해소 방안

  • 페이지 처리 또는 부분범위 처리 활용
  • Decode 함수 또는 Case문으로 변환
  • 뷰 머지 방지를 통한 함수 호출 최소화
  • 스칼라 서브쿼리의 캐싱효과를 이용한 함수 호출 최소화
  • Deterministic 함수의 캐싱 효과 활용
  • 복잡한 함수 로직을 풀어 SQL로 구현


I/O 효율화 원리

블록 단위 I/O

  • Sequential vs. Random 액세스
  • Sequential 액세스 선택도 높이기
  • Random 액세스 발생량 줄이기

Memory vs. Disk I/O

  • I/O 효율화 튜닝의 중요성
  • 버퍼 캐시 히트율(Buffer Cache Hit Ratio)
  • 네트워크, 파일시스템 캐시가 I/O 효율에 미치는 영향

Single Block vs. Multiblock I/O

Prefetch

  • 인덱스 Prefetch
  • 테이블 Prefetch

Direct Path I/O

  • Direct Path Read/Write Temp
  • Direct Path Read
  • Direct Path Write

RAC 캐시 퓨전

  • 전송 없는 읽기 : Read with No Transfer
  • 읽기/읽기 전송 : Read To Read Transfer
  • 읽기/쓰기 전송 : Read To Write Transfer
  • 쓰기/쓰기 전송 : Write to Write Transfer
  • 쓰기/읽기 전송 : Write to Read Transfer

Result 캐시

I/O 효율화 원리

  • 필요한 최소 블록만 읽도록 쿼리 작성
  • 최적의 옵티마이징 팩터 제공
  • 필요하다면, 옵티마이저 힌트를 사용해 최적의 액세스 경로로 유도


부록

Library Cache Lock & Pin

  • 라이브러리 캐시 Lock
  • 라이브러리 캐시 Pin
  • 라이브러리 캐시 Lock과 Pin, 두 개의 직렬화 장치를 따로 두는 이유

Cursor_Sharing

Deterministic 함수 사용 시 주의사항

레이블 (0)

  • 레이블 없음
댓글 쓰기...

첨부 파일  (1)

첨부 파일 추가하기
  파일 변경됨
JPEG 파일 200px-X9788996246015.jpg 3월 12, 2013 by 민항