Delta Lake의 기본 개념과 트랜잭션 로그 구조는 GenAI 도구 가이드를 참고하세요.
Unity Catalog에서의 테이블 관리와 권한 설정은 플랫폼 설정 가이드를 참고하세요.
Delta Lake란?
Delta Lake는 데이터 레이크 위에 ACID 트랜잭션, 스키마 관리, 타임 트래블 등을 제공하는 오픈소스 스토리지 레이어입니다.왜 성능 튜닝이 필요한가?
Delta Lake는 기본 설정만으로도 잘 동작하지만, 데이터가 수십 GB권장 실행 순서
처음 성능 튜닝을 시작한다면 아래 순서를 따르세요:1. 클러스터링 전략 선택
의사결정 가이드
Liquid Clustering 설정
아래 SQL은 새 테이블을 만들면서region과 order_date를 클러스터링 키로 지정합니다. 이 두 컬럼으로 필터링하는 쿼리가 자동으로 데이터 스킵의 혜택을 받습니다.
ALTER TABLE을 사용합니다. 키 변경이 즉시 반영되지만, 기존 데이터에 적용하려면 OPTIMIZE를 한 번 실행해야 합니다.
Z-ORDER (레거시)
Liquid Clustering을 지원하지 않는 구버전 환경에서만 사용합니다. DBR 13.3 이상이라면 Liquid Clustering을 권장합니다.2. OPTIMIZE 전략
OPTIMIZE는 여러 개의 작은 파일을 더 큰 파일로 병합(compaction)하고, 클러스터링 키에 따라 데이터를 재배치합니다. 스몰 파일이 줄어들면 쿼리 시 읽어야 할 파일 수가 감소하여 성능이 크게 향상됩니다.
실행 타이밍
예약 실행
전체 테이블을 OPTIMIZE하거나,WHERE 조건으로 최근 데이터만 부분 최적화할 수 있습니다. 부분 OPTIMIZE는 대형 테이블에서 실행 시간을 크게 줄여줍니다.
OPTIMIZE 결과 확인
이 쿼리는 테이블의 작업 히스토리를 보여줍니다.numFilesRemoved(제거된 파일 수)가 크다면 스몰 파일이 많이 병합되었다는 의미입니다.
3. VACUUM 모범 사례
VACUUM이 왜 필요한가?
Delta Lake는 UPDATE, DELETE, OPTIMIZE를 실행할 때마다 새 파일을 생성하고, 이전 파일은 Time Travel(과거 버전 조회)을 위해 그대로 남겨둡니다. 이 “더 이상 현재 버전에서 사용하지 않는 파일”이 계속 쌓이면 스토리지 비용이 증가하고, 메타데이터 목록이 커져 파일 리스팅 속도도 느려집니다.VACUUM은 보존 기간이 지난 이전 파일을 물리적으로 삭제합니다.
기본 실행
아래 SQL은 기본 보존 기간(7일)보다 오래된 불필요 파일을 삭제합니다.안전한 VACUUM 설정
테이블 속성으로 보존 기간을 설정해두면, VACUUM 실행 시 별도로 기간을 지정하지 않아도 됩니다.VACUUM 주의사항
4. Photon 활성화 체크리스트
Photon 효과 확인
5. 스몰 파일 문제 진단 및 해결
스몰 파일이 왜 문제인가?
Delta Lake는 데이터를 Parquet 파일로 저장합니다. 파일 하나를 읽을 때마다 메타데이터 파싱, 파일 열기/닫기, 네트워크 요청 등의 오버헤드가 발생합니다. 예를 들어 1GB 데이터가 10개의 100MB 파일에 있으면 오버헤드가 10번이지만, 1000개의 1MB 파일에 있으면 오버헤드가 1000번 발생합니다. 데이터 양은 같지만 파일 수가 많으면 I/O 비용이 수십 배 증가합니다.진단
이 쿼리는 테이블의 전체 파일 수(numFiles)와 총 크기(sizeInBytes)를 보여줍니다. 평균 파일 크기 = sizeInBytes / numFiles로 계산하세요.
원인별 해결
자동 컴팩션 활성화
이 설정을 켜면 쓰기 작업 시 자동으로 파일을 최적 크기로 병합합니다. 수동 OPTIMIZE를 자주 실행하기 어려운 환경에 유용합니다.6. 쿼리 최적화 팁
Predicate Pushdown 확인
클러스터링 키나 파티션 키로 필터링하면 Delta Lake가 불필요한 파일을 건너뛰어 읽기 양을 크게 줄일 수 있습니다(Data Skipping). 단, 필터 컬럼에 함수를 적용하면 이 최적화가 무효화됩니다.Column Pruning
필요한 컬럼만 선택하면 읽는 데이터 양이 줄어듭니다. Parquet는 컬럼별로 데이터를 저장하므로SELECT * 대신 필요 컬럼만 지정하면 I/O가 크게 감소합니다.
JOIN 최적화
작은 테이블(수만 건 이하)을 조인할 때BROADCAST 힌트를 사용하면, Spark가 작은 테이블을 전체 노드에 복사하여 셔플 없이 조인합니다.