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이 전화 받는 중에 다음 콜이오면 다음 직원이 수신할 수 있다.
'cd database > 대용량데이터베이스' 카테고리의 다른 글
대용량 DB 10강 (인덱스 , 조인) (0) | 2014.05.16 |
---|---|
대용량 DB 9강 정리 (인덱스 선정) (0) | 2014.05.14 |
대용량 DB 7강 정리 (index의 사용) (0) | 2014.05.03 |
대용량 DB 4강 정리(병렬처리, DB내부구조) (0) | 2014.04.15 |
대용량 DB 3강 정리 (entity 종류, DB모델링의 중요성) (0) | 2014.04.14 |