DAG를 실행했을 때 처리하는 속도가 느림
레코드를 적재할 때 INSERT INTO를 하면 레코드가 하나씩 적재되기 때문에 비효율적임
왜 이런 상황이 생길까?DB에서 보통 대량 처리 전용 엔진을 제공하는데 DB가 내부적으로 한 번에 읽고, 한 번에 기록하고, 한 번에 인덱스 정리를 해준다.
snowflake : COPY INTO
PostgresSQL : COPY
MySQL : LOAD DATA INFILE
- 데이터가 외부에서 오는 경우 네트워크 왕복이 많아지기 때문에
- 트랜잭션도 많아짐
❗️단, 트랜잭션과 네트워크는 1:1이 아님 네트워크(이동 비용), 트랜잭션(되돌릴 수 있는 단위)
- 트랜잭션이 단순해진다.
- 네트워크 왕복이 극적으로 줄어든다
- 실패 처리가 훨씬 명확하다
대량의 데이터를 적재할 땐 주로 중간 저장소인 Stage가 필요하다
정의 : Snowflake 에서 파일을 임시 저장하여 데이터를 로드/언로드할 때 사용 하는 스토리지
주요 명령어
- PUT : 로컬 시스템에서 파일을 스테이지로 업로드
- LIST : 스테이지에 저장된 파일 목록 확인
- REMOVE : 스테이지에서 파일 삭제
- GET : 스테이지에서 파일을 로컬 시스템으로 다운로드
External Stage
S3 / GCS / Azure Blob 같은 외부 스토리지를 Snowflake가 직접 바라보도록 연결한 스테이지
큰 데이터 처리가 필요한 경우 사용
AWS S3, Google Cloud Storage, Azure Blob Storage
Internal Stage(내부 스테이지)
Snowflake가 직접 관리하는 내부 저장 공간
스테이지 선택
- 소규모 임시 데이터: User Stage
- 단일 테이블 로드: Table Stage
- 정기 배치 작업: Named Stage
- 대용량/외부 연동: External Stage
- User Stage (@~)
- 각 사용자별로 할당된 개인 저장 공간으로 사용자 계정 생성시 자동으로 생성됨
- @~로 시작하는 경로 사용
- 임시 데이터 로드에 적합- Table Stage (@%)
- 특정 테이블과 연결된 스테이지로 테이블 생성시 자동으로 생성됨
- @%로 시작하는 경로 사용
- 단일 테이블 데이터 로딩에 주로 사용- Named Stage (@)
- CREATE STAGE로 명시적 생성
- 여러 사용자/프로세스가 공유 가능
- 영구적인 특성
- 반복적인 데이터 로드에 적합
변경 전
변경 후