사내에서 모처럼 AWS SA를 초청하여 Athena에 대한 Session을 듣고 성능 개선에 대한 노하우를 들었다. 중간에 회의가 있어서 나갔다 오긴 했지만 핵심적인 내용들은 아래와 같아서 메모해 두었다.
Athena와 같은 serverless 서비스들은 그들이 만든 방식대로 사용해야지 가장 효율적이라고 생각한다. 특히나 Hadoop 기반의 파일 시스템 위에서 돌아가는 Data Lake 기반의 SQL 엔진 서비스들을 기존의 방식대로만 쓰면서 "왜 RDS 처럼 빠르게 조회가 되지 않지?" 라고 생각하는 것은 소모적인 일이다.
위 방식 중에서 두 가지를 써보았는데 약간의 개선이 느껴졌다. 하나는 파티션을 int로 타입 캐스팅을 해주어봤고, 그 다음은 큰 테이블을 왼쪽에 두어봤다. join 이나 from 절에서 왼쪽에 위치시켰다. 수치로 증명할 시간까지 되지는 않았지만 약간 빠르다는 생각이 들었다.
full scan 을 하는지 하지 않는지도 속도에 중요한 영향을 미친다. 즉, partition이나 index 레벨에서 데이터를 가져온 뒤에 또 다른 where 조건 (예를 들면, 값에 대하여 이상 이하를 filter 한다던지, 동일한 값으로 찾는 조건을 건다던지)가 추가되면 그것은 full scan을 수행해야 한다는 뜻이다. 만약 full scan을 함으로써 시간이 지나치게 증가된다면 where 조건은 partition과 index에 사용된 column 만 사용한 후, python과 같은 프로그램으로 추가 가공하는 것을 권장한다.
요즘 우리 팀에서 관리하는 s3 + Glue + Athena가 파티션 과대 문제로 실제로 쓰기가 어려워진 상태가 되었는데, 지금 단계에서 운영되는 파일들을 재조정하기는 어려우므로 지금부터 쌓이는 데이터들을 다른 catalog의 새로운 테이블로 옮겨서 가벼운 파티션 구조를 가져가면 어떨까 한다. 그렇게 해본 뒤 성능 차이가 확인되면 기록해보려고 한다.