2. 송춘자 cjsong@naver.com
ChemEssen,Inc 개발부서장
고려대학교 컴퓨터정보통신대학원 소프트웨어공학과
‘16 PostgreSQL DB 시작
‘99 web program 시작
‘97 Oracle Process Monitoring tool 제작 by PB
‘96 OCP-DBA 7.3 취득
‘93 UNIX & C System program 시작
3. About ChemEssen, Inc
2006 설립, 40개 기술특허, 글로벌 웹서비스
화학기술과 정보기술의 융합 서비스 제공
Chemical Quantum Application + Mathematical Modeling + IT
4. 검색 속도 개선 상황 발생
신규 자료 입력 발생
Master data 285만건 1억6백만건, 37배 증가
Master data size 25 GB 1 TB, 40배 증가
검색속도 저하 발생
651 msec 10분 17초, 948 배 증가 (ID)
1.2 초 7분 20초, 367 배 증가 (name)
773 msec 10분, 776 배 증가 (smiles)
Chemical data 특수성
IUPAC Name
• (3R,6R,7R)-2,3,7-trimethyl-6-(propan-2-yl)tetradecane
• N'-[(2E)-3-(3,4-dimethoxyphenyl)prop-2-enoyl]-2-phenylacetohydrazide
Smiles
• CC(C)CCCC(C)C3CCC4C2CC=C1CC(O)CCC1(C)C2CCC34C
Formula
• C27H46O
• C11H14O3S2
5. 속도 개선 결과
구분 Column type 285만건
1억6백만건
개선전
1억6백만건
개선후
ID VC(12) 651 msec 10분 17초 32 msec
Name VC(4890) 1.2 sec 6분 16초 7 sec
Smiles Text 773 msec 10분 25초 547 msec
Formula VC(50) 1.2 sec 10분 33초 32 msec
InChIKey VC(50) 930 msec 10분 22초 46 msec
6. 속도개선방법
개발소스에서 사용중인 SQL query 변경
업무규칙 변경 가능 부분 협의 적용
Index 재생성
Text Search 기능 적용
DBMS Parameter 조정
7. Text Search 기능 적용 순서
검색 전용 tsvector 컬럼 추가
ALTER TABLE chemicalsc.tb_chem_info
ADD COLUMN textsearchable_index_col tsvector;
Data update
UPDATE chemicalsc.tb_chem_info SET textsearchable_index_col
= to_tsvector('english', coalesce(replace(upper(iupac_name), ' ', ''), ''));
Gin 인덱스 생성
CREATE INDEX idx_chem_info_textsearchable_index_col
ON chemicalsc.tb_chem_info USING gin (textsearchable_index_col)
TABLESPACE tbs_chemical_idx00;
8. Sql query - 개선 전
SELECT chem_info_id, iupac_name,
(length('Benzene') - length(iupac_name) + 100) as jaro
FROM chemicalsc.tb_chem_info
WHERE iupac_name_upper_stuck like replace(upper( '%Benzene%' ), ' ', '' )
ORDER BY jaro desc, iupac_name asc
LIMIT 2000;
9. Sql query - 개선 후
SET work_mem to '100MB';
SELECT chem_info_id, iupac_name,
(length('benzen’) - length(iupac_name)+100) as jaro
FROM chemicalsc.tb_chem_info
WHERE textsearchable_index_col @@ to_tsquery('english', 'benzen')
ORDER BY jaro desc, iupac_name asc
LIMIT 2000;
10. DB Server Spec
Version: PostgreSQL 9.5.8 on x86_64-pc-linux-gnu
CPU : XeonE5-2643 3.3GHz*8
RAM : 32 GB
Disk : 24 TB (1+0)
Max Connection : 100
11. postgresql.conf
effective_cache_size
데이터 캐싱에 사용할 수 있는 메모리 양
인덱스 사용여부 결정
shaed_buffers할당메모리+사용가능한OS캐시 메모리
시스템 전체메모리 *(50% ~ 75%)
32GB * 50% = 16GB, 32GB * 75% = 24GB
maintenance_work_mem
Vacuum, create index 작업시 사용
1GB당50MB
32 * 50MB = 1,600 MB
shared_buffers
Disk IO최소화 목적
시스템 전체 메모리 *25%
32 GB * 0.25 = 8 GB
13. Data update하면서…
인덱스 생성은 data insert / update 이후 생성
인덱스 생성된 상태에서
data file 301개 update 처리진행 42일 소요
Vaccum 설정 check 필수 – 1억건 이상
data file 301개 auto vaccum 처리 10일 소요
데이터 insert 시 COPY command 이용
set command 이후 copy command
Source data 파일 여러 개 분할하여 COPY 진행
입력 실패시 재작업 최소화