장 요약
제 1절 데이터베이스 아키텍처
titleBGColor=#B0C4DE
- 임시 데이터 파일은 대량의 정렬이나 해시 작업을 위해 사용된다.
- 로그 파일 : DB 버퍼 캐시에 가해지는 모든 변경사항을 기록했다가 캐시 복구나 데이터베이스 복구에 사용.
- SGA : 여러 프로세스에 공유되기 때문에 내부적으로 래치(Latch), 버퍼 Lock, 라이브러리 캐시 Lock/Pin 같은 액세스 직렬화 매커니즘이 사용(DB버퍼캐시, 공유풀, 로그버퍼 등)
- PGA : 개별 서버 프로세스만의 전용 데이터를 저장해 두는 메모리 영역.
가장 큰 용도 : 데이터 정렬
세션과 커서에 관한 상태 정보를 저장.
다른 프로세스와 공유되지 않기 때문에 래치와 같은 직렬화 매커니즘이 필요 없어 버퍼 캐시에서 블록을 읽을 때 보다 훨씬 빠름. - 서버프로세스 : 사용자 프로세스와 통신하면서 사용자의 각종 명령을 처리,
백그라운드 프로세스 : Dirty 버퍼와 로그 버퍼를 디스크에 기록, 인스턴스 및 프로세스를 복구
제 2절 SQL 파싱 부하
- '소프트파싱' :공유 메모리에서 SQL과 실행계획을 찾아 곧바로 실행
- '하드파싱' :공유메모리에서 SQL을 찾지 못해 실행계획을 새로 생성하고 실행.
- 공유메모리에서 SQL을 찾기 위해 사용되는 키 값은 SQL 문장 그 자체임.
- Literal SQL로 프로그램을 작성하면 새로운 값이 입력될 때 마다 하드파싱을 일으켜 쿼리 성능이 저하됨
- OLTP 환경에서 SQL 파싱 부하를 최소화하려면 반드시 바인드 변수를 사용.
- 바인드 변수를 사용하면 옵티마이저가 칼럼 히스토그램을 활용하지 못한다는 단점
값의 분포가 균일하지 않은 칼럼을 조건절에 사용할 때는 UNION ALL을 이용해 실행계획을 분기하는 방안을 고려 - 같은 SQL을 반복 수행하고자 할 때 애플리케이션 커서 캐싱 기법을 이용하면 캐시에서 SQL 실행계획을 찾는 부하를 없애줘 성능 향상에 도움이 됨.
제 3절 데이터베이스 Call과 네트워크 부하
- 루프를 돌면서 여러작업을 반복 수행한느 프로그램을 One SQL로 구현하면 큰 성능 개선 효과를 얻을 수 있으며, 그 핵심원리는 데이터베이스 call을 줄이는 데있다.
- Array Processing을 잘 활용하면 데이터베이스 Call 횟수를 크게 줄여줘 One SQL로 통합할 때와 비슷한 수준의 성능 효과를 얻을 수 있다.
- 쿼리 결과집합을 전송할 때, 전체 데이터를 연속적으로 전송하지 않고 사용자로부터 Fetch Call이 있을 때마다 일정량씩 나누어서 전송하는 것을 '부분범위 처리'라고 한다.
- 부분범위처리 원리를 이용하면 대용량 OLTP 환경에서 극적인 성능개선 효과를 얻을 수 있다.
- 대량 데이터를 읽을 때는 ArraySize를 크게, 소량은 작게 설정
- 원격 조인 시 네트워크를 통한 데이터 전송량을 줄임으로써 성능을 높일 수 있다.
- 메인 쿼리가 참조하는 사용자 정의 함수에 또 다른 쿼리문이 내장되어 있으면 수행 성능이 훨씬 나빠진다.(Recursive Call 반복)
- 사용자 정의 함수는소량의 데이터를 조회할 때, 또는 부분범위처리가 가능한 상황에서 제한적으로 사용해야한다. 가급적 조인 또는 스칼라 서브쿼리 형태로 변환
제 4절 데이터베이스 I/O 원리
- Oracle을 포함한 모든 DBMS에서 I/O는 블록(=페이지) 단위로 이루어 진다.
- 물리적으로 한정된시스템 자원을 효율적으로 사용하기 위해 디스크 I/O를 최소화하고 버퍼 캐시 효율을 높이는 것이 I/O 튜닝 목표
- 네트워크 문제든, 파일시스템 문제든 I/O 성능에 관한 가장 확실하고 근본적인 해결책은 논리적인 블록 요청 횟수를 최소화 하는 것이다.
- Sequential 액세스 : 레코드간 논리적 또는 물리적인 순서를 따라 차례대로 읽어나가는 방식,
Random 액세스: 한건을 읽기 위해 한 블록 씩 접근 - Single Block I/O : 한번의 I/O Call에 하나의 데이터 블록만 읽은 후 메모리에 적재
Multiblock I/O : I/O Call 발생 시점에 인접한 블록들을 같이 읽어 메모리에 적재하는 방식 - 논리적인 I/O요청 횟수를 최소화 하는것이 I/O 효율환 튜닝의 핵심 원리(최소한의 블록만 Read하도록.)