cd database/대용량데이터베이스

대용량 DB 5강 정리(lock)

성덕 2014. 4. 22. 23:40

5

1. 오라클 parallel 서버(OPS)

l  ops의 목적

-       가용성

: 어느 상황이 되더라도 시스템은 죽지 않고 계속 사용될 수 있어야 한다.

-       성능향상

-       비용절감

 

2. 공유 메모리 캐쉬

-       DBA의 인스턴스가 start되면 메인 메모리에 SGA가 상주하게 된다.

 

l  SGA의 주요구성

1. DB block buffer

           2. Shared pool area

           : 파싱, 실행계획, sql 테스트를 저장하는 영역, 2번 이상의 같은 쿼리를 실행하면

           최초에 저장된 메모리에서 확인함.

 

3. 멀티 블락 I/O

-       Full table scan시 하나가 아닌 여러 개의 block을 동시에 조회한다.

-       예를들어, User 100개의 서버에 sql을 수행했다면, DB writer가 데이터를 DB block buffer cache영역에 데이터를 올리고 내리는 등의 저장하는 일을 수행함.

이 때, Redo log writer log 버퍼에 로그를 썼다, 삭제하는 작업을 수행한다.

 

4. 경합 없는 조회 (Locking 발생이 없음)

 

[USER1]

UPDATE emp

SET      sal = sal*1.1

WHERE  job=’CLERK’

 

 

[USER2]

SELECT sal

FROM emp

WHERE job=’CLERK’

 

USER1이 전자의 쿼리를 수행 후 COMMIT하지 않은 채로, USER2이 후자의 쿼리를 수행했다고 가정하자. 수정된 sal의 데이터값이 나올까?

오라클은 UPDATE COMMIT 전에 조회하면 lock이 발생하지 않고 COMMIT 전의 데이터가 조회된다

è  SNAPSHOT 기능 ( 쿼리 수행 전 BEFORE 이미지를 ROLLBACK SEGMENT(RS)에 저장 )

Commit시 데이터가 저장되어 잇는 RS가 반환 중에 다른 user가 해당 RS를 조회할 경우 ‘snapshot too old’ 에러가 떨어진다. 이 현상은 oracle에만 존재하고, 완벽하게 피할 수 있는 방법은 없다. 다만 최소화 하기 위해서는 commit을 자주 하는 방법은 옳지 않고, 작업을 한꺼번에 한 후 commit을 하는 것이 좋다.

 

5. 행 단위 locking

-       Locking 메커니즘은 row level locking이 가장 완벽하다.

n  row level locking : 똑같은 레코드를 건드리지 않는 한 locking 현상이 없음

 

l  extent의 중요성

-       테이블 스페이스 할당 시 생각하고자 하는 사이즈만큼 extent를 할당해 줘야 하는데,

Extent 사이즈를 쪼갤 경우 데이터 하나를 조회하기 위해 쪼갠 extent를 다 거쳐야 하기

때문에 조회 속도가 느려진다.

그렇다고 너무 크게 잡아버리면 데이터를 쓰지 못하고 빈 공간으로 남아버리기 때문에,

어느 정도의 데이터 양을 생각해서 할당해 주는 것이 좋다.

 

6. for update 경합의 해소

 

예시)

 콜 센터에 직원이 10명이 있다고 하자. 개발자는 직원의 전화 호출 순서를 아래의 쿼리로 프로그램을 짜게 되었다.

 

Select col1, col2

From AT

Where col1 = ‘20’

And rownum = 1

For update; -- (내가 select 하면서 update할거기 때문에 다른 놈은 건드리지 마라…)

è  결과는 직원1 만 계속 전화를 받는 현상이 발생하였다.

 

Why? 전화 올 때마다 위의 쿼리가 실행이 되고 (계속 같은 직원 호출) 직원1이 전화를 끊으면서 lock이 해제되면, 이 후 대기하고 있던 쿼리 실행이 되는데,

개발자는 직원1이 전화를 받아서 lock이 걸리면 다음 콜은 다음 rownum으로 넘어갈 줄 알았던 거로 생각하였으나, 현실은 시궁창 인 것이다.

 

해결)

CREATE SEQUENCE seq

START WITH 1

INCREMENT BY 1

MAX VALUE 10

CYCLE

CACHE 9;

----------------------------------- 1. 시퀀스 생성

SELECT col1, col2

FROM ( SEL.ECT ROWNUM AS rnum, coll, col2

FROM AT

WHERE col1 = ‘20’)

WHERE rnum = seq

AND ROWNUM = 1;

----------------------------------- 2. 쿼리 생성

è  위와 같이 수정하면 직원1이 전화 받는 중에 다음 콜이오면 다음 직원이 수신할 수 있다.