DB/PostgreSQL

External table (PXF 기반) 에서 데이터 읽어올 때 - 메모리. I/O 문제

박쿠리 2025. 4. 21. 23:39

PXF 프레임워크를 사용해서 External table 생성하는 경우

 

PXF 설명 : https://cool-ri.tistory.com/6

 

Greenplum PXF

Greenplum PXF : Greenplum이 아닌 외부시스템에서 가지고 있는 DATA 를 Greenplum 으로 Load 할 수 있는 프레임워크  외부시스템 DATA는 ORACLE, Mariadb 처럼 RDBMS의 테이블이 될 수 있으며 하둡의 HDFS, 파일시스

cool-ri.tistory.com

 

디스크에 저장된 deflate/csv 파일을 즉석에서 읽어서 GPDB 로 스트리밍처럼 처리함.

-> 테이블처럼 보이지만 실제로는 파일을 직접 읽어옴

 

항목 External Table 내부 Table (heap/append-optimized)
데이터 위치 외부 (PXF: HDFS, S3, etc) GPDB 디스크 내
데이터 접근 방식 실시간 스트리밍 읽기 빠른 블록 I/O 읽기
병렬 처리 최적화 제한적 (파일 분할 기반) 매우 강력 (분산, 인덱스, 분할)
중간 결과 처리 모두 메모리 기반 → spill 가능성 ↑ 디스크 정렬, temp spill, group 처리 가능
query planner 힌트 활용 거의 없음 partition pruning, 인덱스, 통계 사용 가능
성능 예측 가능성 낮음 (네트워크·I/O 영향 큼) 높음 (메모리와 디스크 기반 계산 안정)

 

  external table에서 group by + array_agg 내부 테이블에서 동일한 group by + array_agg
쿼리 SELECT key_col, array_agg(val_col)
FROM ext_table
GROUP BY key_col;
과정
  • 외부 데이터를 즉석에서 읽으며, key별로 메모리에 list 누적
  • 외부 테이블은 인덱스 없음, 통계 없음, 분할 없음
  • 파일이 압축(deflate)되어 있으면 디코딩 + 전송까지 추가 오버헤드
  • 데이터양이 많으면:
    • 메모리 부족 시 spill
    • I/O 성능에 따라 전체 쿼리 느려짐
  • Query Plan도 External Scan -> GroupAggregate 형태, 최적화 여지 작음
  • 데이터는 이미 GPDB segment 디스크에 있음
  • 디스크 정렬, temp spill, 병렬 scan, partition pruning, 쿼리 플래너 최적화 모두 사용 가능
  • 성능 예측 안정 + 실패 복구도 쉬움
  • Query Plan은 Seq Scan -> HashAggregate 또는 GroupAggregate 등 최적화됨
특징 데이터를 디스크에서 바로 읽음 (PXF)
GPDB가 데이터를 미리 캐시하거나 정렬 불가
streaming 구조라 중간 취소·복구 어려움
데이터를 세그먼트 디스크에서 블록 단위로 읽음
GPDB가 디스크 정렬, spill, temp 파일 처리 가능
disk 기반으로 partial spill 가능
구조 파일 한 줄 읽고 → groupby 처리 → 다음 줄 읽고..." 이런 구조
메모리 overflow 나면 바로 fail
데이터를 먼저 disk block으로 chunked load
→ 필요 시 부분적으로 spill to disk
Query Plan  External Scan on ext_table
  GroupAggregate
    -> Sort (in-memory or spills)
Gather Motion
  GroupAggregate
    -> Seq Scan on internal_table
       (can use bitmap index if available)

 

 

반응형

'DB > PostgreSQL' 카테고리의 다른 글

Unlogged Table 정의  (0) 2025.04.22
쿼리 튜닝 - 플랜 분석 예시 (memory 부족)  (0) 2025.02.18
could not find segment file  (0) 2025.01.22
cgroup  (0) 2024.11.18
GPDB - Query Plan 예시  (0) 2024.10.01