대용량 DB 4강 정리(병렬처리, DB내부구조)
1. parallel 프로세싱
l Parallel 프로세싱을 왜 사용하는가?
- 복잡한 쿼리의 수행속도의 개선
- 배치작업(다량의 데이터)
- 저렴한 cost의 투자로 퍼포먼스를 발휘할 수 있음.
l 예제
SELECT sum(revenue), store FROM line_items WHERE profit(price, cost, units) > 0.2 GROUP BY store
이와 같은 작업을 parallel로 처리하면,
1. 각각의 데이터를 CPU별로 쪼개서 range 스캔을 함.
2. profit 함수 연산을 함.
3. group by를 위해 상점별로 range 별로 sort
(** 10g이전에는 자동 sort, 이후에는 order by 따로 적용 필요)
4. 결과를 query coordination 에 의해서 결과를 모아서(grouping) 실행결과를 출력함.
2. parallel 쿼리의 실행구조
- Static partition
n 정적으로 물리적으로 분할되어 있음
n 관리가 편함
n 퍼포먼스 면에서도 좋음
n 이마트에서 계산하려고 줄 서있는 것과 같음
- Dynamic partition
n 가변성이 있는 구조에서 사용.
n 물리적인 I/O 가 다량 분산되어 있기 때문에 다량의 데이터 처리에 부담.
3. parallel 사용방법
- table creation(create index) 하면서 full scan 시 무조건 parallel로 처리하도록 할 때 parallel degree 를 설정.
n Ex) parallel 20; 로 설정 시 20개의 cpu bound job으로 돌아감.
( ** degree는 4이상 주지 말 것!)
n 최소 CPU가 3개 이상은 되어야 parallel 처리의 의미가 있음
- Alter Table (alter Index ) parallel 설정
n 오라클 block이 4k짜리가 있다. 데이터를 집어넣기 시작해서 데이터 양이 full로 찼을 때, 특정데이터의 값을 update 하고자 할 때 빈공간이 없기 때문에 다른 block에서 사용하고, 그 정보를 링크 시켜놓음
è Block chain 현상 (오라클 6)
n 현상을 보완하기 위해 데이터 full일 때 하나의 데이터가 수정되어 row piece 가 쪼개질 것 같으면(1과 같은경우) 그 row전체가 다른 block으로 이동함
è row migration (오라클 7)
n 그리고 이 chaning 현상을 막기 위해서 pctfree 가 등장.
Pctfree 10 설정 시 10%만 남으면 다른 block을 사용. 사용 하고 있는 Block 안에 있는 데이터 수정 시에는 그 설정한 10%안의 공간으로 사용한다. 그러나 10%경계선에서 데이터를 추가로 삭제 하여도 다시 insert 될 때는 그 빈 block을 사용할 수 없는데,
n 남은 90%에서 데이터를 계속 삭제 후 일정 수준 이하로 떨어질 경우 빈공간을 사용할 수 있도록 설정 할 수 있음.
è pctused
n 인덱스에는 pctused와 같은것이 없기 때문에 데이터가 삭제되도 빈 공간이 계속 할당되어 있을 뿐 재사용이 불가하다. 그래서 Balance-tree à skew 현상이 발생하게 됨.
è rebuild 작업을 필요!. (오라클 7.3)
4. Client vs Server 처리의 주체?
- 작업에 따라 클라이언트 or 서버에 맞게 개발해야 함.(R&R에 맞게?-_-)
- DBMS call 횟수를 줄여야 한다.
n DB에서 세션 물릴 때 DB서버에서는 PGA(resource)가 할당되어 커넥션이 되고, Disconnect 시 할당된 resource를 반납 하는데 이 횟수가 잦으면 시스템에 부하가 발생함.
è 그래서, DB호출이 잦은 경우 API 방식으로 프로그래밍 하여 Connection 세션을 유지하도록 함
5. DBMS 내부구조
- DB가 StartUp이 되면 인스턴스가 start 되고 메인 메모리에 SGA할당되어 상주하게 된다. SGA의 영역에 가장 큰 영역이 DB Block Buffer phycal I/O를 줄이기 위해 Block Buffer 캐시를 만들어서 자주쓰는 Block은 메모리에서 I/O하도록 함.
(도서관의 최근 대여 목록과 같음ㅋㅋ)
n 쿼리는 바인딩쿼리로 짜야 변수가 변경되어도 같은 쿼리로 인식하여 결과가 빠르게 도출됨.
- Redo 로그 버퍼 데이터의 모든 변경사항 before after 이미지를 리두로그 버퍼에 쌓임.