Presto 성능 향상 Tip
1. 필요한 컬러만 사용. 와일드 카드(*) 사용 금지.
[GOOD]: SELECT time,user,host FROM tbl
[BAD]: SELECT * FROM tbl
2. 항상 시간 조건 사용
- 조건은 정수용으로하고 실수로 하면, 파티션키가 타지 않음. 날짜 연사자를 사용할 것.
3. Group by 최적화
- GROUP BY는 GROUP BY를 한 칼럼을 기반으로, 각 행을 메모리의 GROUP BY 값에 보유하는 작업자 노드에 배포합니다. 행을 처리 할 때 GROUP BY 칼럼을 메모리에서 조회하고 값을 비교합니다. GROUP BY 열이 일치하면 그 값은 함께 집계됩니다. 따라서, 쿼리에서 GROUP BY를 사용하는 경우 분산성이 가장 높은 카디널리티 (Cardinality 즉, 고유 값의 대부분이 균등하게 분산)별로 칼럼을 정렬합니다
[GOOD]: SELECT GROUP BY uid, gender
[BAD]: SELECT GROUP BY gender, uid
4. Order by 최적화
- ORDER BY를 사용하려면 모든 행을 단일 작업자에게 전송한 다음 정렬해야합니다. 이로 인해 Presto에 대한 메모리 부담이 발생할 수 있으며 이로 인해 쿼리 실행 시간이 오래 걸릴 수 있으며 쿼리가 실패할 수도 있음.
상위 또는 하위 N 레코드를 조회하려면 정렬 비용 및 메모리 부담을 줄일 수있는 LIMIT를 사용ORDER BY 절을 사용하여 위 또는 아래 N 값을 확인하는 경우, LIMIT 절을 사용하면 단일 작업을 수행하는 대신 정렬 작업을 수행하여 개별 작업자를 제한하여 정렬 비용을 크게 줄일 수 있습니다.
[GOOD]: SELECT * FROM tbl ORDER BY time LIMIT 100
[BAD]: SELECT * FROM tbl ORDER BY time
5. Like 최적화
- 문자열 열에서 여러 값을 필터링 할 때는 일반적으로 LIKE 보다 여러 번 RegEx를 사용하는 것이 좋습니다. LIKE 할 내용이 많고, 문자열 열이 클수록 RegEx를 사용하면 절약 효과가 커집니다.
SELECT
...
FROM
access
WHERE
regexp_like(method, 'GET|POST|PUT|DELETE')
6. join 절에서 큰 테이블을 먼저 지정
두 테이블을 Join 할 때 Join 왼쪽에 큰 테이블을 지정하고 오른쪽에 작은 테이블을 지정하십시오. Presto는 오른쪽 테이블을 작업자 노드에 배포 한 다음, 테이블을 왼쪽으로 스트리밍하여 조인을 수행합니다. 오른쪽에 있는 표가 더 작으면 사용되는 메모리가 적어지고 조회가 더 빨리 실행됩니다. (기본:브로드 캐스트 조인). 이 유형의 조인은 오른쪽 테이블이 한 노드 (일반적으로 2GB 미만) 내에 들어갈만큼 작을 때 작동합니다. 'Exceeded max memory xxGB'오류가 표시되면 오른쪽 테이블이 너무 큽니다. Presto는 자동 조인 재정렬을 수행하지 않으므로 큰 테이블이 모든 조인 절에서 작은 테이블보다 우선합니다
6.1 Turning on the distributed hash join
If you still see the memory issue, try a distributed hash join. This algorithm partitions both the left and right tables using the hash values of the join keys. So the distributed join works even if the right-hand side table is large, but the performance might be slower because the join increases the number of network data transfers. To turn on the distributed join, embed the following session property as an SQL comment:
-- set session distributed_join = 'true'
SELECT ... FROM large_table l, small_table s WHERE l.id = s.id
Presto 성능향상 Tip 참조링크
- https://support.treasuredata.com/hc/en-us/articles/360001450908-Presto-Performance-Tuning
- https://aws.amazon.com/ko/blogs/korea/top-10-performance-tuning-tips-for-amazon-athena/