티스토리 뷰

새로 쓴, 대용량 데이터베이스 솔루션

얼마 전에 비교적 지금까지 해왔던 프로젝트에 비해 대용량 데이터(?)를 가진 커뮤니티 프로젝트를 진행했다. 프로젝트를 진행하면서 내가 지닌 데이터베이스에 대한 지식이 턱없이 부족하다는 것을 느껴서 책을 한 권 사보았다.

상세보기

느낀점

내가 생각했던 것보다 글 내용이 더 로우레벨이다. 끝까지 읽지는 않았지만 성능향상을 위해 이해해야 할 내용 중에 물리적 구성에 대한 이야기를 처음에 많이 하고 있다. 물리적인 구성에 대한 이해도 효과가 크다고 하지만, 지금 난 어떻게 SQL을 효과적으로 작성하는지.. 인덱스를 만들것인지와 같은 논리적인 성능 향상이 더 알고싶다. 암튼 내가 기대했던 것이 데이터베이스의 효과적인 사용법이였다면, 이 책은 사용법 이전에 데이터베이스의 구조부터 모두 훑고 있다. 더군다나, 오라클을 베이스로 설명해 나가다 보니 구체적인 실제 사용법은 Pass하는 부분이 많아진다. 좀 지루한 면이 없진 않지만 유익한 것은 확실하다. 책을 읽어 나가면서 조금씩 요약, 정리해 본다.

요약

1.1 테이블과 인덱스의 분리형

분리형 테이블 구조에서는 데이터의 물리적 주소가 달라져도 논리적 주소는 계속 유지되고, 논리적 주소로 데이터를 찾을 수 있다. 물리적으로 저장된 데이터는 수시로 위치가 변할 수 있으므로 당연하다. 분리형 테이블 구조에서 성능에 막대한 영향을 미치는 것이 클러스터링 팩터, 즉, 하나의 질의를 수행할 때 뒤져야 할 물리적인 데이터 영역(블럭)이 얼마나 많은지에 대한 수치이다. 클러스터링 팩터를 향상 시키기 위해서는 정기적으로 디비를 재생성하여, 인덱스와 테이블 영역을 재정렬해야 한다.

인덱스를 구성할 때에는 현실에 입각한 종합적이고 전략적인 인덱스를 구성해야 한다. 당장의 문제해결에만 급급하여 함부로 인덱스를 생성하지 마라.

1.3 클러스터링 테이블

클러스터링은 곧 비슷한 데이터(테이블들이 될 수도 있고, 특정 컬럼의 값이 동일한 로우들이 될 수도 있다)를 물리적으로 인접한 위치(동일 클러스터)에 저장시키는 것이다. 조인이 될 로우들이 물리적으로 인접해 있다면 조인시 비용을 크게 줄일 수 있다.

클러스터링 인덱스와 일반 인덱스의 차이점, 일반 인덱스는 로우마다 하나씩의 인덱스를 가진다. 클러스터링 인덱스는 컬럼의 값마다 하나씩 인덱스를 가진다. 즉 클러스터링은 비슷한 값을 가지는 로우를 모아놓기 위해 사용하는 것이다. 이는 클러스터링 팩터를 향상시키기 위한 전략이다.

다중테이블 클러스터링은 결국 제1정규화(테이블쪼게기)의 단점을 극복하는 것. 정말 요긴할 것 같이 설명하더니, 효과적인 만큼 추가비용이 많다고... 특별할 경우에만 사용하라 한다.

2.1 B-tree 인덱스

인덱스 구조로 B-tree를 사용한다. 리버스 키 인덱스는 키값을 리버스 시켜서 사용한다. 그 이유는 키값을 분산시켜 B-tree 분포를 넓게한다. 깊이가 얕아지므로 좋다. 대신 = 연산만 사용해야 한다.

2.2 비트맵 인덱스

Pass~

2.3 함수기반 인덱스

Pass~

3.1 옵티마이저

옵티마이저는 규칙기반, 비용기반 옵티마이저로 구분된다. SQL을 작성할 때 (규칙기준) 옵티마이저가 어떻게 작동할 것이라는 것을 미리 예상할 정도의 실력을 만들어라.
규칙기준 옵티마이저는 인덱스, 클러스터링 연산자의 형태등의 정보를 가지고 판단, 비용기준 옵티마이저는 테이블 크기, 인덱스내의 컬럼값 분포도 등의 통계정보를 가지고 판단, 통계정보는 이미 제공되는 프로시져를 활용하는 것이 매우 좋은 방법

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함