Druid에서 좋은 쿼리를 작성하는 팁
Druid에서 좋은 쿼리를 작성하는 팁
Druid SQL로 쿼리 성능과 정확성을 조사하고 개선하는 데 도움이 되는 팁과 예시를 소개해요. 쿼리 성능 조사, 성능 개선(캐싱·근사 사용, 수동 튜닝) 방법을 다뤄요.
출처: 문서
본문
이 주제는 Apache Druid SQL을 사용해 쿼리 성능과 정확성을 조사하고 개선하는 데 도움이 되는 팁과 예시를 포함해요.
Druid SQL에 대한 대화형 튜토리얼을 보려면 Learn Druid repo 의 Learn the basics of Druid SQL 문서를 참고해요.
데이터를 효과적으로 쿼리할 수 있는 능력은 Apache Druid에 데이터를 수집하고 저장한 방식에 크게 좌우돼요. 이 문서는 데이터를 모델링할 때 Schema design tips and best practices 에서 설명한 모범 사례를 따랐다고 가정해요.
쿼리 성능 조사
쿼리가 예상보다 느리게 실행되면 다음 도구를 사용해 쿼리 성능 문제를 조사할 수 있어요.
쿼리 메트릭 분석
Druid 프로세스가 쿼리 실행 모니터링에 필수적인 메트릭을 내보내도록 구성할 수 있어요. 자세한 내용은 Query metrics 문서를 참고해요.
explain plan 생성
explain plan은 전체 쿼리 세부 정보와 Druid가 이를 실행하기 위해 수행하는 모든 연산을 보여줘요. 계획의 정보를 사용해 쿼리 개선 가능 영역을 식별할 수 있어요.
Explain plan 및 Interpreting explain plan output 문서를 참고해요.
Get to know Query view 튜토리얼을 따라 Druid 콘솔에서 예시 explain plan을 만들 수 있어요.
쿼리 성능 개선
대부분의 경우 Druid 설정을 조정하고 쿼리를 수동으로 튜닝해 쿼리 성능을 개선할 수 있어요.
Druid 설정 조정
이 섹션은 쿼리 성능 개선에 도움이 되는 Druid 설정을 설명해요.
쿼리 캐싱 켜기
자주 접근하는 데이터에 대해 쿼리 시간을 개선하려면 Druid에서 캐싱을 활성화할 수 있어요. 캐싱은 동일 시스템에서 동시성을 높여, 동시·혼합 워크로드를 처리하는 쿼리에서 눈에 띄는 성능 향상을 제공해요.
캐싱으로 인한 가장 큰 성능 이득은 TopN과 timeseries 쿼리에 적용되는 경향이 있어요. GroupBy 쿼리의 경우 Broker의 병합 단계가 병목이라면 캐싱을 활성화해도 눈에 띄는 개선이 거의 없어요. 자세한 내용은 Performance considerations for caching 문서를 참고해요.
근사(approximation) 사용
가능하면 Druid가 기본적으로 TopN을 활성화하도록 SQL 쿼리를 TopN 근사 규칙에 맞게 설계해요. Druid가 TopN을 자동으로 최적화하려면 SQL 쿼리에 다음이 포함되어야 해요:
- 하나의 dimension에 대한 GROUP BY, 그리고
- 하나의 aggregate에 대한 ORDER BY.
자세한 내용은 TopN queries 문서를 참고해요.
TopN 쿼리는 각 데이터 프로세스가 자신의 상위 K 결과를 순위 매기고 상위 K 결과만 Broker에 반환한다는 점에서 근사적이에요.
Learn Druid repo 의 Using TopN approximation in Druid queries 튜토리얼을 따라 근사를 켜고 끌 때의 예시를 연습해 볼 수 있어요. Get to know Query view 튜토리얼은 Druid 콘솔에서 집계 쿼리를 실행하는 방법을 보여줘요.
쿼리 수동 튜닝
이 섹션은 쿼리 정확성과 성능을 개선하는 데 사용할 수 있는 기법을 설명해요.
한 번에 하나의 테이블 쿼리
Druid 프로세서의 부하를 최소화하려면 한 번에 단일 테이블을 쿼리해요.
특정 컬럼만 선택
테이블에서 모든 컬럼을 가져오는 대신 쿼리에 필요한 컬럼만 선택해요. 이렇게 하면 데이터베이스에서 가져오는 데이터 양이 줄어 쿼리 성능이 개선돼요.
필터 사용
WHERE 절 같은 필터를 사용하고 시간으로 필터링해요. 부등호 필터는 매우 리소스 집약적이므로 사용을 최소화해요.
다음 예시 쿼리는 __time 과 product 로 필터링해요:
SELECT FLOOR(__time to day), product, sum(quantity * price) as revenueFROM "orders"WHERE __time > '2023-08-20' and product = 'product 1'GROUP BY 1, 2
다음 예시는 diffUrl 컬럼에 와일드카드 필터를 사용해요:
SELECT * from WikipediaWHERE diffUrl LIKE 'https://en.wikipedia%'AND TIME_IN_INTERVAL(__time, '2016-06-27T01:00:00/2016-06-27T02:00:00')
쿼리 단축
가능한 한 쿼리를 짧게 만들어요 — Druid는 더 짧은 쿼리를 더 빨리 처리해요. 단일 쿼리를 여러 쿼리로 나눌 수도 있어요.
예를 들어 다음 쿼리는 UNION ALL 을 사용해 여러 데이터소스를 대상으로 집계해요:
SELECT id, SUM(revenue) FROM (SELECT id, revenue from datasource_1UNION ALL SELECT id, revenue FROM datasource_2)...UNION ALL SELECT id, revenue FROM datasource_n)GROUP BY id
이 쿼리를 단순화하려면 여러 쿼리로 나눌 수 있어요. 예를 들어:
SELECT id, SUM(revenue) FROM datasource_1SELECT id, SUM(revenue) FROM datasource_2...SELECT id, SUM(revenue) FROM datasource_n
그런 다음 개별 쿼리의 결과를 수동으로 집계할 수 있어요.
서브쿼리 최소화 또는 제거
서브쿼리 task를 미리 계산해 join으로 저장하거나 데이터소스의 일부로 만들 수 있는지 고려해 보세요. 자세한 내용과 예시는 Datasources: join 및 SQL query translation: Joins 문서를 참고해요.
GroupBy의 대안 고려
GroupBy의 대안으로 Timeseries 와 TopN 을 고려해 보세요. 자세한 내용은 GroupBy queries: alternatives 문서를 참고해요.
user ID 같은 고카디널리티 컬럼에 대한 그룹화는 피해요. 먼저 필터를 적용해 그룹화할 결과 수를 줄일 수 있는지 조사해 보세요.
더 작은 interval로 쿼리
더 작은 결과 집합을 반환하도록 더 작은 시간 interval을 쿼리할 수 있는지 고려해 보세요.
예를 들어 다음 쿼리는 시간을 제한하지 않아 리소스 집약적일 수 있어요:
SELECT cust_id, sum(revenue) FROM myDatasourceGROUP BY cust_id
이 쿼리는 더 작은 시간 범위에 대한 여러 쿼리로 나누고, 결과를 클라이언트 측에서 결합할 수 있어요. 예를 들어:
SELECT cust_id, sum(revenue) FROM myDatasourceGROUP BY cust_idWHERE __time BETWEEN '2023-07-01' AND '2023-07-31'SELECT cust_id, sum(revenue) FROM myDatasourceGROUP BY cust_idWHERE __time BETWEEN '2023-08-01' AND '2023-08-31'
쿼리의 계산량 줄이기
쿼리가 많은 변환, 함수, 표현식을 사용하는지 살펴보세요. 계산 수준을 줄이도록 쿼리를 다시 작성할 수 있는지 고려해 보세요.
Druid SQL 쿼리 예시
다음 예시 쿼리는 이 주제에서 설명한 많은 팁을 보여줘요. 이 쿼리는:
- 특정 dimension과 metric을 선택하고
- 근사를 사용하며
- 단일 테이블에서 선택하고
- 저카디널리티 컬럼으로 그룹화하고
- dimension과 시간 모두로 필터링하고
- dimension과 측정값으로 정렬하고
- limit을 포함해요
SELECT FLOOR() AS month, country, SUM(price), APPROX_COUNT_DISTINCT_DS_HLL(userid)FROM salesGROUP BY month, countryWHERE artist = 'Madonna' AND TIME_IN_INTERVAL(__time, '2023-08-01/P1M')ORDER BY country, SUM(price) DESCLIMIT 100
더 알아보기 (Learn more)
- TopN queries — TopN 근사 상세
- Query metrics — 쿼리 메트릭 확인
- Explain plan — explain plan 해석