2018년 4월 19일 목요일

Greenplum 개발 가이드 요약


1.      데이터 분산


  • 각 세그먼트/노드별 데이터 분산이 성능에 가장 중요.
  • 분산키는 명시적으로 정의 (ex, distributed by (컬럼1))
  • PK, UK 있을 경우: PK/UK 컬럼 중 분산도가 좋고, Join 이 많은 컬럼을 대상으로 1~2개 컬럼
  • PK, UK 없을 경우: 분산도가 좋고, Join 이 빈번하게 발생할 컬럼
  • Ex) Device ID, 회원 ID
  • 분산도 확인: Select gp_segment_id, count(*) from Tablename group by gp_segment_id

2.      데이터 모델


  • 비정규화된 스키마 설계 필요(성능적인 측면 고려 시)
    • 매번 여러 개의 디멘젼 테이블이 조인 될 경우 통합 디멘전 테이블 생성
  • 테이블간의 조인 발생 컬럴은 동일한 데이터 타입으로 생성
  • Char Type (사용 금지) => Varchar Type 사용 (함수 사용시 형변환 때문)
  • Database Object10만개 미만 권고(select count(*) from pg_class)

3.      압축


  • Row 단위의 트랜젝션 처리: Insert / update /delete 되는 테이블에는 비압축(마스터성 테이블)
  • 대용량 단위의 트랜젝션 처리: insert/update/delete 되는 테이블에 압축 적용(Fact 테이블)
  • 압축시 옵션:  Compress level 5, zlib 으로 적용

4.      파티션


  • 파티션은 Range Partition 으로 구성
  • 서브 파티션은 가급적 미적용 관리상 어려움 발생
  • 테이블당 파티션을 200개 미만을 권고
  • 파티션에 인덱스를 2~3개 이상 사용시에는 파티션을 구간을 줄이는 것을 권고
    Ex) 월 파티션 => 일 파티션
    대용량/Index 테이블에 여러개 Index가 있을 경우 Data Loading 시 부하 발생 때문
  • Default 파티션 비적용 권고(모든 쿼리실행 시 Default 파티션 scan 발생)

5.      인덱스


  • 인덱스는 가급적 적게 사용 (short 쿼리에 대해서만 적용)
  • 파티션 테이블의 인덱스 컬럼과 파티션 컬럼은 달라야 함. (Local Index 이기 때문에 굳이 파티션 컬럼 사용할 필요 없음)
  • B-Tree index 사용

6.      쿼리


  1. 쿼리 유형



비권고

권고

In, not in, exists, not exists

Join, left outer join

Subquery, inline view

Join 절로 변환

With

Temp Table 로 변환

Distinct

Group by

decode

Case when 절로 변환

Where 절 파티션 컬럼에 Like 절 사용

Where  substr(yyyymmdd, 1,6) = ‘201601’

Where yyyymm like ‘201601%’

파티션 쿼리 수행시 Immutable operation 사용

Where yyyymmdd >= ‘20160101’ and yyyymmdd < ‘20160301’

Where yyyymmdd between  ‘20160101’ and ‘20160228’

 

  1. Short Query 튜닝

  • Index scan nested loop 옵션 설정

  • 쿼리 또는 계정별 옵션 설정
  • Enable_nestloop = true;
  • Random_page_cost = 1;

7.      사용자 테이블 배치 관리 (ETL 포함할 사항)


  • Analyze

  • Greenplum Database Cost Based Optimizer사용으로 통계 정보가 중요
  • 모든 배치 작업 뒤에는 Analyze 수행, 테이블/파티션 레벨

  • Vacuum
    • Delete / update 발생된 테이블은 Dirty Block 발생 방지 용도
    • Dirty Block 재 사용을 위하여 Vacuum 수행
    • 모든 배치 작업 뒤에는 Analyze 수행, 테이블/파티션 레벨
  • Reorg
    • Delete / update 발생된 테이블은 Dirty Block 발생 후에 조치 방법

8.      시스템 카탈로그 관리 (DBA 시스템 관리 목적)


  • 배치 관리(일배치) : Vacuum Analyze 카탈로그 테이블 수행

  • 모든 배치 작업 뒤에는 Analyze 수행, 테이블/파티션 레벨

  • 반년/연간계획:  Vacuum Full Analyze 카탈로그 테이블 수행

9.      ETL 방법


  • Data Loading

  • 권고 사항: Gpload 또는 external table 사용
  • 비권고 사항: ODBC 를 이용한 데이터 적재
  • Gpload 수행 후 vacuum 테이블 수행

  • ETL 수행 순서: Extract => Load => Transform
    • Gpload 수행 후 vacuum 테이블 수행

10. DBA


  • Resource Queue 설정

  • 계정별 Resource Queue 설정(동시 쿼리 수행수, Max Cost, Max Memory 설정)
  • 상세 설정은 DBA 지원 필요

11. 쿼리 플랜


  • 쿼리 플랜 확인 방법

  • Pgadmin 에서 F6 수행 또는 쿼리 제일 앞에 explain를 기입하고 실행

12. 성능 이슈 발생 확인 사항


  1. 프로젝트 종료 후 몇 개월 후에 배치가 서서히느려질 경우

  •  Dimension Table Bloated 된 경우, Vacuum 이 제대로 수행되지 않은 경우

  1. 잘 수행되는 배치가 갑자기 느려질 경우

  • 통계 정보가 제대로 수행되지 않아, 쿼리 플랜이 변경 된 경우
  • Analyze 가 수행이 되었는지 확인 필요

  1. 디스크 IO Busy 때문에 전반적으로 수행이 느린 경우

  • 테이블 압축 여부 확인
  • 테이블에 Index 개수 확인
  • 불 필요한 인덱스 삭제
  • Index Rebuild 검토
  • Fact 파티션 테이블일 경우 파티션 기간을 조절하여, Index 부하를 줄임.

  1. Short 쿼리가 느린 경우

  • 다른 세션에서 Disk IO를 많이 일으킬 경우 발생 가능
  • Index 테이블에 데이터 적재하는 경우 발생 가능성 있음.

  • Index 테이블 사이즈를 최소화 함.(파티션 기간 조정)

  1. 쿼리툴 접속이 느려지는 경우

  • Resource Queue Active session 확인
  • 시스템 카탈로그 테이블 사이즈 검토 및 Vacuum, index rebuild 검토

Greenplum Backup & Restore

Greenplum에서는 gpbackup과 gprestore를 이용해서 대량의 데이터를 병렬로 백업/병렬로 복구를 지원하고 있습니다. Full 백업이외에도 incremental 백업을 지원하고 있습니다.  - incremental 백업시에는 반드시 사전...