Inner Query를 활용한 BigQuery Partitioned Table 쿼리

현온·2023년 11월 23일
0

BigQuery

목록 보기
1/2
post-thumbnail

BigQuery Partitioned Table을 비용 절약을 위해 많이 사용을 할텐데 쿼리 시 Partition Time을 지정해야만 사용이 가능합니다.

Partition Time을 지정하는 방법
(date를 기준으로 partition된 table)

  1. 상수 값으로 직접 지정
SELECT * FROM `<project_id>.<dataset_id>.<table_id>` 
   WHERE <partitioned_key> < current_date() AND <partitioned_key> >= DATE_SUB(current_date(), interval 1 MONTH);
   
SELECT * FROM `<project_id>.<dataset_id>.<table_id>` t1
   WHERE <partitioned_key> < '2023-12-27';

기본적으로 WHERE 절에는 partition time이 상수 값으로 들어가야 합니다. 따라서 위 예시처럼 현재 날짜 혹은 직접 날짜 지정을 통해 테이블에 쿼리를 날릴 수 있습니다.

  1. Inner Query를 사용하는 방법
DECLARE arr_date ARRAY<DATE> DEFAULT (select ARRAY_AGG( DISTINCT <date_column>) from `<project_id>.<dataset_id>.<table_id>`);

SELECT * FROM `<project_id>.<dataset_id>.<table_id>` t1
   WHERE <partitioned_key> in UNNEST(arr_date);

이 글의 핵심이 되는 Inner Query를 사용하는 방법입니다. 1번에서 말씀드렸다시피 기본적으로는 상수 값이 들어가야 하지만 다른 테이블에 있는 값들을 이용해 날짜 기준을 잡고 쿼리를 하거나 중복된 데이터를 삭제하는 등의 작업이 필요할 수 있습니다.

그럴 때 사용 할 수 있는 방법이 DECLAREARRAY를 사용한 배열 변수 이용입니다. 배열 형태로 변수를 만들고, UNNEST를 이용해 [a, b, c, d, ...] 의 형태로 풀어서 해당 배열 안에 속해 있는 날짜들을 파티션 쿼리에 활용할 수 있습니다.

  1. Partition Table Full Scan (비권장)
SELECT * FROM `<project_id>.<dataset_id>.<table_id>` t1
   WHERE <partitioned_key> is not null;
   
SELECT * FROM `<project_id>.<dataset_id>.<table_id>` t1
   WHERE <partitioned_key> < current_date();

보통은 개발 환경에서 임시 Test 용으로 많이 사용하는 Full Scan 쿼리입니다. 데이터의 양이 적다면 상관없지만, 일반적으로는 BigQuery는 DataWarehouse 이기 때문에 많은 양의 데이터를 가지고 있으므로, 자주 사용하는 것은 비용적으로 좋지 않습니다.

profile
Solutions Architect (andrew6371@naver.com)

0개의 댓글