Amazon Athena 는 프로비저닝할 인프라가 없다. 쿼리를 던지면 Athena 가 Trino 기반 엔진(엔진 버전 3)을 대신 돌린다.
-- S3 경로를 가리키는 외부 테이블 정의CREATE EXTERNAL TABLE orders ( order_id BIGINT, amount DOUBLE, status STRING)PARTITIONED BY (dt STRING)STORED AS PARQUETLOCATION 's3://datalake-clean/orders/';
테이블은 Glue Data Catalog 의 메타데이터일 뿐이다. 데이터를 적재하지 않는다(schema-on-read). DROP TABLE 을 해도 S3 의 파일은 그대로 있다.
쿼리 결과는 지정한 S3 결과 위치에 파일로 저장된다. 결과 버킷에도 저장 요금이 쌓이므로 수명주기 만료 규칙을 건다.
쿼리는 계정의 동시 실행 쿼터 안에서 돌고, 넘치면 대기한다. DML 쿼리에는 실행 시간 제한이 있다.
💡 관련 이론: Athena 에서는 비용 최적화와 성능 최적화가 같은 방향이다. 둘 다 "S3 에서 덜 읽기"로 귀결되기 때문이다. Redshift 처럼 컴퓨팅을 예약해 둔 서비스에서는 쿼리를 아무리 아껴도 요금이 그대로지만, Athena 는 쿼리를 고친 만큼 청구서가 줄어든다.
-- 파티션 메타데이터 로드 (Hive 스타일 경로일 때)MSCK REPAIR TABLE orders;-- 또는 개별 파티션 추가ALTER TABLE orders ADD PARTITION (dt='2026-06-26')LOCATION 's3://datalake-clean/orders/dt=2026-06-26/';-- 프루닝이 작동: dt 프리픽스만 스캔SELECT status, COUNT(*) FROM ordersWHERE dt = '2026-06-26' GROUP BY status;
MSCK REPAIR TABLE 은 S3 를 훑어 파티션을 추가만 한다. 지워진 파티션을 빼 주지 않고, 파티션이 많으면 오래 걸리다 타임아웃되어 일부만 등록된 상태로 끝날 수 있다. 매일 파티션 하나를 추가하는 용도로는 ALTER TABLE ADD PARTITION 이 맞다.
파티션이 수만 개면 카탈로그 조회가 병목이다. 파티션 프로젝션으로 등록 없이 규칙으로 계산한다.
-- 필요한 컬럼만 SELECT → 컬럼형 포맷에서 스캔량 절감SELECT order_id, amount FROM orders WHERE dt = '2026-06-26';-- SELECT * 는 모든 컬럼을 스캔하므로 피한다
LIMIT 은 스캔량을 보장해 주지 않는다. 정렬이나 집계가 끼면 전체를 읽은 뒤에 자른다.
파티션 키에는 등호 조건이 가장 잘 듣는다. 모든 파티션 키에 등호가 걸리면 메타데이터를 직접 집어 온다.
실행 전 EXPLAIN 으로 어떤 파티션이 대상인지, 실행 후 EXPLAIN ANALYZE 나 쿼리 통계의 "스캔한 데이터"로 실제 읽은 양을 확인한다.
💡 관련 이론: CSV 를 Parquet + 압축으로 바꾸면 "컬럼 프로젝션(필요한 컬럼만)", "압축(같은 타입 값이 모여 잘 줄어듦)", "통계 기반 건너뛰기"가 한꺼번에 적용된다. 그래서 포맷 변환은 Athena 비용 문제에서 가장 먼저 꺼내는 카드다. 파티션은 그다음, 쿼리 수정은 그 위에 얹는다.
데이터 소스 커넥터를 통해 S3 밖의 소스(RDS·Aurora, DynamoDB, Redshift, CloudWatch Logs, OpenSearch, 그 밖의 JDBC 소스 등)를 같은 SQL 로 조회·조인한다.
-- S3 의 주문 데이터와 RDS 의 고객 마스터를 조인SELECT o.order_id, c.customer_name, o.amountFROM awsdatacatalog.sales.orders oJOIN rds_postgres.public.customers c ON o.customer_id = c.customer_idWHERE o.dt = '2026-06-26';
Athena 가 커넥터를 호출해 읽을 범위를 정하고, 병렬성을 관리하고, 필터 조건을 소스로 내려보낸다(조건 푸시다운).
커넥터는 전통적으로 사용자 계정의 Lambda 함수로 배포된다. 그래서 Lambda 호출 요금이 따로 들고 Lambda 의 한도 안에서 돈다. 최근에는 일부 소스에 대해 Lambda 없이 Glue 연결로 동작하는 커넥터도 제공되지만, 시험 자료는 Lambda 기반으로 설명한다.
읽기 전용이다. 페더레이션 소스에 INSERT INTO 는 지원되지 않는다. 다만 페더레이션으로 읽어 S3 에 CTAS 로 쓰는 것은 된다(소스 → 레이크 추출 파이프라인).
조인 대상 소스에 실제 쿼리가 나가므로 운영 DB 에 부하가 간다. 대량 조인을 반복하면 Read Replica를 가리키게 하거나 데이터를 레이크로 옮기는 편이 낫다.