본문 바로가기

Oracle DB

(36)
세그먼트에서의 대기 이벤트들 - enq: HW – contention HWM을 여러 프로세스가 동시에 변경하는 것을 막기 위한 락을 HW 락이라고 부른다. HWM을 이동시키고자 하는 프로세스는 반드시 HW 락을 획득해야 한다. HW 락 경합은 세그먼트의 급속한 공간 확장이 필요한 경우에 매우 보편적으로 나타나는 대기 현상이며 극단적인 성능 저하를 야기하는 경우도 종종 발생한다. 세그먼트 공간관리기법은 크게 FLM과 ASSM으로 나뉘는데, FLM을 사용하는 경우에 특히 HW 락 경합이 문제가 되는 경우가 많다. FLM을 사용할 경우 HWM의 이동을 결정하는 FREELISTS 속성의 기본값이 1로 세팅되어 있기 때문이다. FLM을 사용하는 경우 FREELISTS 값을 동시 트랜잭션의 수를 고려해서 충분히 크게 잡아주거나, _BUMP_H..
트랜잭션에서의 대기 이벤트들 - enq: TM – contention DML이 수행되는 동안,DML과 관련된 객체에 대한 변경을 방지하기 위해 DML을 수행하는 프로세스는 반드시 해당 테이블에 대해 TM 락을 획득해야 한다. TM락에는 DML락과 DDL락이 있다. DML 락은 실제로는 TM 락과 일치한다 DML 락은 DBA_DML_LOCKS 뷰를 통해 관찰 가능한데 이 뷰는 V$LOCK 뷰에서 락 유형이 TM인 것만을 추출해서 보여주는 역할을 한다. DDL 락은 실제로는 library cache lock과 일치한다 DDL락은 DBA_DDL_LOCKS 뷰를 통해 관찰가능한데, 이 뷰는 실제로는 X$KGLLK 뷰를 적절히 가공해서 보여주는 역할을 한다. 일반적인 DML 문은 테이블에 대해 TM 락을 Sub-Exclusive (SX) 모..
라이브러리 캐시(Library Cache)에서의 대기이벤트들 - latch: shared pool shared pool 래치는 Shared Pool의 기본 메모리 구조인 힘을 보호하는 역할을 한다. 프리 청크를 찾기 위 해 프리리스트를 탐색하고, 적절한 청크를 할당하고, 필요한 경우 프리 청크를 분할하는 일련의 작업들은 모두 shared pool 래치를 획득한 후에만 가능하다. 주로 발생하지는 않으나, 동시에 여러 세션이 청크를 할당 받아야하는 경우, 혹은 하드파싱이 심한 경우 청크를 쪼개는 현상이 자주 발생하고 이로 인해 프리리스트에 수많은 작은 크기의 프리 청크들이 붙는 현상이 발생한다. 이 현상을 단편화라고 부르며, 단편화로 인해 프리리스트를 탐색하는 시간이 길어지고, 그만큼 shared pool 래치를 보유하는 시간이 늘어난다. 이로 인하여 shared p..
버퍼 캐시에서의 대기 이벤트들 - latch: cache buffers chains 버퍼 캐시를 사용하기 위해 해시 체인을 탐색하거나 변경하려는 프로세스는 반드시 해당 체인을 관리하는 cache buffers chains 래치를 획득해야 한다. 읽기 전용의 목적으로 체인을 탐색하는 경우에는 cache buffers chains 래치를 Shared 모드로 공유할 수 있어 경합을 줄이는데 도움이 된다. cache buffers chains 래치 경합이 발생하는 대표적인 경우는 다음과 같다. 1) 비율적인 SQL 2) 핫블록 (Hot Block) - 비효율적인 SQL 비효율적인 SQL 문장이 cache buffers chains 래치 경합의 가장 중요한 원인이다. 동시에 여러 프로세스가 넓은 범위의 인덱스나 넓은 범위의 테이블에 대해 스캔..
리두와 OWI - 리두 개요 특별한 경우를 제외하면, DML에 의해 생긴 모든 변화에 대해서 리두 데이터를 생성한다. 리두 데이터를 생성하는 이유는 복구를 위한 것이다. 오라클은 "Write ahead rule"과 "Log force at commit"이라는 두 가지 메커니즘을 이용해 데이터의 복구를 보장한다. Write ahead rule은 데이터를 변경시키기 전에 반드시 리두를 먼저 생성한다는 것이다. Write ahead rule은 DML에 의한 변화는 버퍼 캐시에 저장되기 전에 먼저 리두 버퍼에 저장되어야 하고, 버퍼 캐시의 더티 버퍼를 데이터파일에 기록하기 전에, 해당되는 리두 레코드를 리두 버퍼로부터 리두 로그에 파일로 기록한다는 원칙으로 이루어진다. Log force at commit이란 사용자가 커밋을 ..
I/O와 OWI - I/O 개요 I/O 작업 레이어는 다음과 같이 나눌 수 있다. 1) 어플리케이션 레이어: select / insert / update / delete / truncate 2) 오라클 메모리 레이어: Buffer cache | PGA 3) 오라클 세그먼트 레이어: Datafile, tempfile, Tablespace, Segment 4) OS/디바이스 레이어: Async I/O, Direct I/O, Raw Device, RAID, …. I/O 성능 문제의 원인을 파악하는 것과 해결책을 찾는 과정은 항상 1,2,3,4의 순서를 따라야한다. - 어플리케이션 레이어 어플리케이션을 효과적으로 구현하여, 불필요한 I/O를 최소화해야 한다. 비효율적인 어플리케이션을 두고 시스템을 튜닝한다는 것은 거의 불가능하..
세그먼트와 OWI - 세그먼트 개요 세그먼트는 테이블, 인덱스, 언두, LOB 등 오라클이 제공하는 모든 종류의 논리적인 공간을 말한다. 오라클은 사용된 공간과 아직 사용되지 않은 공간을 구분하는 표식인 고수위선(HWM)이 있다. HWM은 세그먼트 헤더 블록에 그 정보가 저장된다. 오라클은 세그먼트 공간관리기법으로 FLM(수동관리)와 ASSM(자동관리)가 있다. 테이블스페이스 생성 시 부여하는 segment space management 속성에 의해 기법이 결정된다. - FLM (FreeList Management, 수동 세그먼트 공간 관리) 프리리스트란 프리 블록을 링크드 리스트 형태로 관리하는 기법을 말한다. 세그먼트 헤더 블록에서는 프리리스트의 헤더 위치와 테일 위치를 관리한다. 개별 데이터 블록에는 블록이 프리리스..
트랜잭션과 OWI - 트랜잭션 개요 사용자가 DML을 수행하게 되면 오라클은 내부적으로 다음과 같은 순서로 작업을 진행한다. 1) 해당 트랜잭션에 대해 언두 세그먼트를 할당한다. 할당이 실패하면 오프라인 상태의 언두 세그먼트를 온라인화해서 사용한다. 이 과정마저 실패하면, 새로운 언두 세그먼트를 생성한다. 2) 언두 세그먼트를 할당 받으면, 언두 세그먼트 헤더에 트랜잭션 테이블 슬롯을 생성한다. 3) 트랜잭션 테이블을 생성하고 나면 TXID를 생성하고, 현재 트랜잭션에 할당한다. 트랜잭션은 반드시 언두 영역을 할당 받은 다음에 ID를 부여받는다. 4) 트랜잭션의 대상이 되는 블록들을 버퍼 캐시로 적재하고 블록 헤더의 ITL에 트랜잭션 엔트리를 등록한다. 5) 변경할 블록들의 변경 정보는 PGA에 체인지 벡터라는 이름으로 ..