2022년 7월 17일 일요일

[AWS] Athena쿼리 가이드

Athena

FaceBook에서 개발한 오픈소스 인메모리 분산쿼리엔진 Presto를 사용


파티셔닝
- WHERE절 사용시 파티셔닝된 컬럼사용을 우선시하여 쿼리비용 감소
- 파티션 수가 너무 많으면 파티션 메타데이터를 처리하는데 오버헤드가 증가해, 비용과 쿼리속도 저하 (테이블당 최대 10만개 파티션)
- 파티션 수가 너무 적을 시, 참조하는 파티션이 중복되면 파티션의 이점을 살리지 못함
- 데이터가 없는 파티션은, 제거하여 관리


파일 압축과 크기
- 파일압축으로 데이터가 작을 수록 쿼리속도와 S3에서 Athena까지 네트워크 트랙픽 감소
- Parquet, ORC 파일 사용 권장
- 파일사이즈가 작을 경우(128MB 이하), 읽기과정에서 생기는 오버헤드가 많이 일어나고
  파일사이즈가 클경우, 한파일을 다 읽을 때까지 대기해 아테나 병렬기능을 활용하지 못함


ORDER BY 최적화
- Athena Presto엔진은 모든 데이터행을 전송한 다음 정렬을 실행
- 정렬된 위, 아래의 N개 값을 활용하는 경우 LIMIT절 사용하여 비용 및 쿼리 실행 시간 절감


JOINS 최적화
- Athena의 Presto엔진은 왼쪽에서 오른쪽으로 조인을 수행
- 왼쪽에 데이터가 큰 테이블을 지정하고 오른쪽에 작은테이블 지정해야 사용메모리가 적어지고 조회가 빨라짐


GROUP BY 최적화
- group by 쿼리에서 높은 카디널리티를 가지는 순으로 칼럼을 정렬하여 사용
* 카디널리티(Cardinality) : 고유 값이 균등하게 분산된 정도


윈도 함수
- 윈도 함수는 메모리를 많이 사용하므로 PARTITION BY절과 함께 사용을 권장
- 윈도 함수 대신 같은 기능의 다른 쿼리 사용 권장


LIKE
- 문자열에 LIKE '%string%' 보다는 regexp_like() 함수 및 정규표현식 사용하여 비용절감
- '%string%' 보다 '%string' 사용시 스캔데이터 감소


필요한 컬럼만 사용
- Asterisk (*) 사용 지양
- Column의 수를 줄이면 전체 쿼리 실행 파이프 라인을 통해 처리하는 데이터양이 줄어듬


참조 :
https://docs.aws.amazon.com/ko_kr/athena/latest/ug/performance-tuning.html
https://aws.amazon.com/ko/blogs/korea/top-10-performance-tuning-tips-for-amazon-athena/
https://www.upsolver.com/blog/aws-athena-performance-best-practices-performance-tuning-tips
https://jaemunbro.medium.com/aws-athena-presto-query-guide-886ce047d710

댓글 없음:

댓글 쓰기