새소식

반응형
GCP/BigQuery

big query 비용을 줄이기 위한 전략

  • -
반응형

안녕하세요. 

big query에서 파티션 컬럼을 사용하여 불필요한 부분을 읽지 않고 데이터를 가져옴으로써 비용과 성능을 최적화하는 부분은 많은 분들이 알고 계실 듯합니다. 

 

 

위와 같이 파티션 컬럼을 이용할 경우 많은 이점을 가질 수 있지만 그렇게 하지 못하는 경우가 존재할 수 있습니다.

만약에 테이블에 날짜 컬럼이 여러 가지인데, 사용하고자 하는 날짜 컬럼이 파티션 되지 않은 경우가 다음과 같은 경우입니다. big query에서는 일반 RDB처럼 여러 개의 인덱스(파티션 칼럼)를 제공하지 않습니다. 그렇기 때문에 1개의 파티션 칼럼을 통해서 성능을 향상해야 하는데요. 이 경우 매우 난감한 상황이 발생합니다. 

기준으로 하는 날짜 컬럼으로 값을 가져올 경우 데이터가 맞지 않는데 성능, 비용 때문에 이를 써야 하는 경우라면 이상한 데이터를 그대로 써야 하므로 말이 되지 않습니다. 그렇기 때문에 다음과 같은 방법을 통해서 데이터를 조회하면 성능, 비용을 모두 잡고 정확한 데이터를 가져올 수 있습니다.

이 방법은 다음과 같이 그림을 통해서 보면 이해가 빠릅니다.

 

 

위와 같이 데이터가 들어가 있다고 가정 해보고 2개의 날짜 컬럼은 다음과 같이 누적 됩니다. 

  • TODAY 컬럼 : 2019-03-01 , 2019-03-02… 같이 date형식으로 적재
  • LOGTIME 컬럼(파티션 : 2019-03-01 12:30:20 와 같이 datetime 형식으로 적재

위의 내용을 참고해서 2020-02-25 ~ 2020-03-03까지의 일자별 건수 데이터를 집계하여 보여줘야 할 경우 어떻게 해야 할까요?

일반적으로 다음과 같이 쿼리를 만들 수 있습니다.

1
2
3
4
5
select TODAY,count(*)
from test_table
where TODAY > '2020-02-25' and TODAY < '2020-03-04'
group by TODAY 
order by TODAY asc
cs

 

위와 같이 할 경우 TODAY 컬럼이 파티션 컬럼이 아니므로 당연히 성능에 좋은 영향을 가지지 못합니다. 

다음과 같이 빅쿼리에서 쿼리를 실행하기 전에 예상 비용을 보면 그 비용이 많이 나오는 것을 볼 수 있습니다.

 

 

하지만 다음과 같이 파티션이 적용되어 있는 컬럼을 이용해서 쿼리를 변경하면 비용이 엄청나게 떨어지는 것을 볼 수 있습니다.

 

1
2
3
4
5
select TODAY,count(*)
from test_table
where (LOGTIME > '2020-02-24' and LOGTIME < '2020-03-05') and (TODAY > '2020-02-25' and TODAY < '2020-03-04')
group by TODAY 
order by TODAY asc
cs

 

이 쿼리의 비용을 보면 다음과 같습니다.

 

 

엄청나게 비용이 줄어 들었습니다. 결과는 같을 까요?

물론 결과도 완전하게 똑같습니다. 위에서 보시면 LOGTIME을 앞뒤로 +- 1일씩 더 가져와서 (혹시 모를 누락 대비) 이를 다시 TODAY로 필터 합니다. 이렇게 하면 완전히 정확한 데이터를 가져옴과 동시에 범위를 확연하게 줄임으로써 비용을 낮출 수 있습니다.

이 같은 경우는 매우 극단적인 시나리오로써 제가 만들었지만 여러가지 시나리오가 존재하며, 제가 이전에 작성한 포스트에서 이를 활용한 실제 예시를 볼 수 있습니다. (예제 바로가기)

이렇게 함으로써 저 같은 경우 100배 이상의 검색 비용을 줄임으로써 많은 도움을 받았습니다. 특히 big query의 경우 작은 기업의 경우 일일 쿼터를 제한해서 쓰는 경우가 많기 때문에 이는 매우 큰 도움이 될 것으로 보입니다.

 

감사합니다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.