GA4 BigQuery를 분석할 때 쿼리 성능 저하를 일으키는 4가지 사례와 해결 방법

데이터브릭스(Databricks) 환경에서 GA4 BigQuery 데이터를 분석할 때, 쿼리 성능이 예상보다 느려지는 경우가 종종 발생합니다. 특히, 위젯을 활용한 변수 입력 방식이 성능 저하를 유발하는 경우를 직접 경험했습니다. 본 글에서는 데이터브릭스에서 쿼리 성능을 낮추는 대표적인 방식 4가지를 설명하고, 이를 해결하는 방법을 제시하겠습니다.

1. 데이터브릭스 위젯을 이용한 변수 입력

문제점

데이터브릭스의 dbutils.widgets 기능을 사용하여 변수를 설정한 후, 쿼리에서 해당 변수를 사용하는 경우 쿼리 속도가 느려지는 문제가 발생할 수 있습니다. 예를 들어, 아래와 같이 위젯을 사용하여 날짜 범위를 지정할 수 있습니다.

from datetime import datetime
import dbutils

dbutils.widgets.text("start_date", "2024-01-01")
dbutils.widgets.text("end_date", "2024-01-31")

start_date = dbutils.widgets.get("start_date")
end_date = dbutils.widgets.get("end_date")

이후 SQL에서 이를 변수로 사용하면 다음과 같이 동작합니다.

SELECT * FROM ga4_table
WHERE event_date BETWEEN '${start_date}' AND '${end_date}'

이 방식은 실행될 때마다 변수 값을 참조해야 하므로, 최적화된 쿼리 플랜이 생성되지 못하고 성능이 저하됩니다.

해결 방법

위젯을 사용할 필요 없이, 쿼리에 직접 값을 입력하면 성능이 향상됩니다.

SELECT * FROM ga4_table
WHERE event_date BETWEEN '2024-01-01' AND '2024-01-31'

또한, 위젯을 사용할 경우에도 변수를 직접 CAST하여 명확한 데이터 타입을 지정하면 성능 개선에 도움이 될 수 있습니다.

SELECT * FROM ga4_table
WHERE event_date BETWEEN CAST('${start_date}' AS DATE) AND CAST('${end_date}' AS DATE)

2. 서브쿼리 남발

문제점

서브쿼리를 과도하게 사용하면 쿼리 최적화가 어려워지고 실행 속도가 느려질 수 있습니다. 예를 들어, 아래와 같은 서브쿼리는 불필요하게 많은 데이터를 처리하게 만듭니다.

SELECT * FROM (
    SELECT event_name, COUNT(*) AS event_count
    FROM ga4_table
    WHERE event_date BETWEEN '2024-01-01' AND '2024-01-31'
    GROUP BY event_name
) subquery
WHERE event_count > 100

이 방식은 전체 데이터를 먼저 집계한 후 필터링을 수행하므로 불필요한 연산이 추가됩니다.

해결 방법

필터링을 먼저 수행한 후 집계를 하는 방식으로 변경하면 성능이 향상됩니다.

SELECT event_name, COUNT(*) AS event_count
FROM ga4_table
WHERE event_date BETWEEN '2024-01-01' AND '2024-01-31'
GROUP BY event_name
HAVING COUNT(*) > 100

3. 와일드카드 테이블 사용 시 비효율적인 필터링

문제점

BigQuery에서 날짜별로 분할된 테이블을 사용할 경우, * 와일드카드 테이블을 사용하여 데이터를 조회하는 경우가 많습니다. 그러나, 적절한 필터링 없이 전체 데이터를 검색하면 성능 저하가 발생할 수 있습니다.

예를 들어, 다음과 같이 ga4_table_* 와일드카드 테이블을 사용하면, 모든 테이블을 스캔하게 됩니다.

SELECT * FROM `project.dataset.ga4_table_*`
WHERE event_date BETWEEN '2024-01-01' AND '2024-01-31'

해결 방법

특정 날짜 범위의 테이블만 조회하도록 TABLE_SUFFIX를 활용하면 성능이 향상됩니다.

SELECT * FROM `project.dataset.ga4_table_*`
WHERE _TABLE_SUFFIX BETWEEN '20240101' AND '20240131'

이 방식은 BigQuery가 해당 날짜 범위 내의 테이블만 스캔하도록 하여 처리 속도를 대폭 개선합니다.


4. 조인 시 데이터 타입 불일치

문제점

조인을 수행할 때 데이터 타입이 일치하지 않으면 암시적 변환이 발생하여 성능이 저하될 수 있습니다. 예를 들어, event_dateSTRING 타입이고, dim_date 테이블의 date 컬럼이 DATE 타입이라면 다음과 같은 조인이 암시적 변환을 발생시킵니다.

SELECT a.*
FROM ga4_table a
JOIN dim_date b ON a.event_date = b.date

여기서 event_dateSTRING이면 b.dateSTRING으로 변환하거나, a.event_dateDATE로 변환하는 과정이 추가됩니다.

해결 방법

조인을 수행하기 전에 명시적으로 타입을 변환하여 최적화할 수 있습니다.

SELECT a.*
FROM ga4_table a
JOIN dim_date b ON CAST(a.event_date AS DATE) = b.date

또는, 데이터를 적절한 타입으로 변환하여 저장하는 것이 좋습니다.

SELECT event_date::DATE AS event_date, event_name FROM ga4_table

결론

데이터브릭스에서 GA4 BigQuery 데이터를 분석할 때 쿼리 성능 저하를 방지하려면 다음과 같은 점을 유의해야 합니다.

  1. 위젯 사용 시 쿼리 최적화: 변수 참조를 줄이고 명확한 데이터 타입을 지정하기.
  2. 서브쿼리 최소화: 불필요한 중첩 쿼리를 제거하고 필터링을 먼저 수행하기.
  3. 와일드카드 테이블 최적화: _TABLE_SUFFIX를 활용하여 검색 범위를 제한하기.
  4. 조인 시 데이터 타입 정리: 암시적 변환을 방지하고 명확한 타입 변환을 수행하기.

이러한 방법을 따르면 데이터 분석 속도를 크게 개선할 수 있으며, 보다 원활한 GA4 데이터 분석이 가능합니다.

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다