데이터베이스/데이터베이스

[Bigquery] 파티션 테이블 (Partition Table)

sseozytank 2023. 8. 31.

1. 파티션 테이블이란? 

테이블의 데이터를 일정한 기준에 따라 분할하여 저장하는 방법

아래 사진 처럼 기존 테이블을 일정한 기준으로 나누어 분할하여 저장하는 것이다. (아래의 경우 월 단위로 Partition 한 경우) 

https://towardsdatascience.com/how-to-use-partitions-and-clusters-in-bigquery-using-sql-ccf84c89dd65

2. 파티션을 사용하는 이유** 

제일 쉽게 이해할 수 있도록 동일한 쿼리를 실제 파티션 여부에 따라서 성능 비교했던 사진을 들고왔다. 

 

1) 파티션 나누기 전  

읽은 레코드가 19만개로, 전체 데이터를 긁어온 것을 확인할 수 있다. 

 

2) 파티션을 나눈 후 

파티션 적용 전

읽은 레코드 자체가 1/3로 줄어든 것을 확인할 수 있다. 

 

즉, 파티션이 없으면 Where 절을 걸어도 풀스캐닝이 들어간 후 SELECT해오지만, Partition 테이블에서는 Partition이 된 부분에서만 스캐닝이 들어가기 때문에 성능적으로 월등히 좋다. 

 

특히 게임 같이 방대한 로그를 다룰 때, 전체 로그에서 최근 데이터를 긁어오는 것보다 최근 데이터에서 최근 데이터를 긁어오는 것이 훨씬 가성비가 넘치기 때문에 꼭 알아두어야한다.

 

그렇다고 파티션 설정 방법이 어려울까? 전혀 어렵지 않다. 오히려 진짜 너무 쉽다. 

 

3. 파티션 설정 방법 

1) 테이블 생성 시 파티션 설정 (SQL ver)

CREATE TABLE dataset_name.table_name
(
    column1 data_type,
    column2 data_type,
    ...
    partition_column data_type
)
PARTITION BY partition_column --파티션의 기준이 되는 컬럼 이름
OPTIONS (
    partition_expiration_days = expiration_days, -- 파티션의 만료 일수 숫자로 적어주면 된다. ex.60 (해당 파티션의 데이터가 자동으로 삭제)
    description = 'table_description'
);

예를 들어 만약 내가 월 단위로 파티션을 설정하고 싶다면, PARTITION BY 쪽에 아래와 같이 변경해주면 된다. 

PARTITION BY DATE_TRUNC(date_column, MONTH)

 

2) 기존 테이블을 파티션 테이블로 변환 (SQL ver) 

CREATE OR REPLACE TABLE dataset_name.table_name
PARTITION BY partition_column
OPTIONS (
    partition_expiration_days = expiration_days,
    description = 'table_description'
)
AS
SELECT *
FROM dataset_name.existing_table;

 

3) GCP GUI로 변경 

1.테이블을 만들고 싶은 데이터셋에서 테이블 만들기 누르기 

2.그럼 아래와 같이 파티션 나누기 없음으로 설정되어 있음을 확인할 수 있는데, 

3.스키마를 입력해주지 않으면 날짜별로만 설정할 수 있고, 스키마를 입력해주면 스키마에서 파티션 설정이 가능하다. 

파티션 나누기 필터에 설정을 해주면 where절이 무조건 필요함! 따라서 이부분은 선택에 맡기면된다. 

4. 테이블 파티션 확인 방법 

- 테이블을 클릭해서 세부정보에 들어가면, 아래와 같이 파티션 정보가 뜬다. 

 

5. 파티션 테이블 확인 

- 위에서 보면, part_ccu_log라는 테이블을 ccu_Time, MONTH 기준으로 파티션 나눔이 되어있다. 

따라서 where 절에서 DATE(ccu_time) ='2023-08-18' 이런식으로 사용해주면, ccu_time이 8월인 파티션 테이블에서만 스캐닝해오는 것이다. 

 

 

이론과 실전 모두 너무쉽지만 복덩이 같은 Bigquery의 Table Partition 기능은 꼭 알아두도록 하자! 

 

댓글