[GCP] BIG QUERY 빅쿼리 partition table 만들기

John
5 min readMar 27, 2020

빅쿼리는 쿼리를 수행할 때 기본적으로 전체 데이터를 풀 스캔하게 된다. 그렇기 때문에 인덱스가 필요 없다는 장점이 있지만, 불필요한 데이터까지 스캔하기 때문에 성능과 과금이 부과된다는 큰 단점을 가지고 있다.

그렇기에 쿼리 실행 시 본인이 지정한 파티션만 스캔하여 전체 스캔양을 줄이면서 성능을 올릴 수 있다

내가 사용한 방법은 두 가지로
1. 빈 테이블에서 partition table 만드는 방법
2. 쿼리 실행 창에서 일반 테이블을 partitioned table로 변경하는 방법이다.

1. 빈 테이블에서 partition table 만드는 방법

기본적으로 BigQuery 테이블은 수집 시간, 날짜/타임스탬프, 정수로 파티션을 나눌 수 있다.

(1) 수집 시간

수집 시간 같은 경우는 [테이블 만들기]-[파티션 및 클러스터 설정]에서 내부 데이터화 시간으로 파티션 나누기를 설정하면 간단하게 완료할 수 있다.

테이블 만들기를 실행하고, 테이블 쿼리를 확인해보면

위 사진과 같이 DATE(_PARTITIONTIME) 이라는 파티션이 생기게 된다.
수집 시간 같은 경우는 외부 데이터를 크롤링하여 데일리로 BigQuery에 적재작업을 자동화하는 경우 유용하게 활용할 수 있다. (기한 없이 계속 진행되는 작업에 유용)

(2) 날짜/타임스탬프

두 번째는 TIMESTMAP / DATE 의 데이터 타입을 가지고 있는 Column에 파티션을 설정하는 방법이다. 가장 빈번하게 사용되는 방법이며, 다음과 같이 만든 파티션 테이블은 아래의 쿼리와 같이 활용할 수 있다.

로그/액션 데이터와 같이 방대한 데이터를 스캔해야 할 때 다음과 같이 파티션을 걸어주어야 성능을 높일 수 있다.

(3) 정수 범위

index와 같은 정수 범위로 되어있는 column에 파티션을 걸어주는 방법이다.
해당 방법을 사용해보진 않았지만, 활용할 수 있는 부분이기에 소개했다. 그렇게 추천하는 방법은 아니다. 참고로 정수 범위는 [1~10000]까지 설정 가능하다.

2. 일반 테이블을 partitioned table로 변경

해당 방법은 이미 만들어진 none-partitioned 테이블을 partitioned table로 변경하는 방법이다. 간단하게 쿼리 실행창에 빈칸을 채워 실행하면

create table [schema-name].[new-table-name];
partition by date([timestamp-column])
as select * from [schema-name].[table-name];
drop table [schema-name].[table-name];

해당 방법을 통해 생성하면 기존에 있는 테이블은 삭제가 되고 새로운 파티션이 된 테이블이 만들어 진다.
이 방법은 데이터의 column 개수가 너무 많아서 하나하나 입력하기 번거로울 때 활용하기에 편한 방법이다.

만약 string형태로 되어있는 (yyyy-mm-dd H:M:S) 형식의 데이터(str_ymd)를 파티션키로 사용하고 싶다면 다음과 같이 입력하면 된다.

create table [new-table-name];
partition by DATE(str_ymd)
as select * except(str_ymd),PARSE_TIMESTAMP('%Y-%m-%d %H:%M:%S',str_ymd) as yyyymmddfrom [schema-name].[table-name];
drop table [schema-name].[table-name];

참고

--

--