1. 문제 정의
1) 90000(가로)*40000(세로) 요소 존재. 각 요소는 real type value를 하나 가짐.
2) 삽입 될 데이터는 서비스에서 UPDATE/DELETE 가 이루어지지 않음.
3) 서비스에서는 point search을 하여 데이터 사용
2. 데이터 삽입 프로세스
1)(방법 #1) 테이블 구조를 (id:p-key, value)로 구성 후 삽입. 여기서 id는 "세로 idx"*sizeof(가로)+ 가로 idx.
- Hash Partitioning 적용(39). 여기서 39는 각 파티션 테이블당 1억개 미만으로 유지하기 위해 설정된 값임
(방법 1 결과)
- 3억 5천 건 데이터 (10%) 삽입 후 총 테이블 사이즈는 24G(index size: 12G)
- 각 파티션 테이블 사이즈는 642 MB(index size:329MB)
(방법 1 생각)
- 10% 삽입했는데....100%면 선형적으로 240G 용량이 필요. 데이터 저장이 효율적이지 않다고 판단
이에, 다른 방법을 강구 하고 있습니다. 그 방법이 방법 2입니다.
- 그전에 방법 1을 하면서 다음과 같은 질문이 있어요.
1) dead tuple이 없었는데... 혹 vacuum full;을 하니 각 파이션 테이블 사이즈가 확 줄었습니다.
642MB --> 476MB. 특히... index size가 확 줄었습니다. 어떤 이유인지 아시나요?
2) 3억 5천 데이터 삽입 시, index size와 pg_relation_size가 329MB와 313MB였습니다.
7억 건 입력 시, 각각 크기가 선형적으로 2배씩 증가하나요? 아니면 비선형(logscale, qudratic?)으로 증가하나요?
2) (방법 #2) 테이블 파티션 없이 Single 테이블 사용. 테이블 구조를 (id(세로 idx): p-key, array) 형성.
서비스 application에서 index를 사용 90000개의 요소를 가진 array 추출 후 탐색하여 특정 데이터 사용
방법#2를 실행하기 전, 타당성을 좀 문의하고자 합니다. 이외, 다른 효율적인 프로세스가 있나요?
전문가 분들의 자문 부탁 드립니다.
|