# 파티션

BigQuery는 컬럼 기반 데이터 웨어하우스로, 쿼리에서 탐색하는 용량에 비례해 비용이 부과됩니다.

비용을 줄일고, 데이터를 잘 관리하기 위해 파티션으로 나뉜 테이블을 사용하게 됩니다.

파티션을 추가하는 경우 장점

  • Query 탐색 범위를 줄입니다(=쿼리 탐색 비용 감소)
    • BigQuery는 쿼리가 데이터를 탐색하는 양만큼 비용을 부과합니다
    • 파티션이 걸린 경우 해당 파티션 범위만 탐색하기 때문에 비용이 덜 부과될 수 있습니다
  • 쿼리 속도가 빨라짐(=쿼리 성능 증가)
    • BigQuery에서 데이터의 양에 따라 쿼리 소요 시간이 달라집니다
    • 데이터의 양이 적으면 더 빠르게 결과가 나타납니다

Partition 나누는 기준

    1. Ingestion time(수집 시간) : 데이터 수집(로드) 날짜를 기준으로 파티션 나눔
    1. DATE/TIMESTAMP : Date나 Timestamp로 파티션을 나눔
    1. Integer(정수 범위) : 정수 값을 기준으로 파티션을 나눔

# 파티션으로 분할된 테이블

웹 콘솔에서 파티션으로 분할된 테이블을 만들려면 데이터셋을 클릭한 후, 테이블 만들기를 눌러주세요.

date_kr, user_id, sign_up_at 3가지 컬럼 모두 파티션을 설정할 수 있습니다

  • date_kr : DATE 타입으로 일자별, 월별, 연도별
  • user_id : INT 타입으로 정수 파티션 설정
  • sign_up_at : TIMESTAMP 타입으로 일자별, 시간대별, 월별, 연도별

파티션 필터 필요를 체크하면 WHERE 조건에 파티션 조건이 없다면 에러 메세지를 발생합니다. 반드시 파티션이 필요할 경우 설정해줍니다(주로 용량이 매우 큰 테이블인 경우)

이제 파티션으로 나뉜 테이블을 클릭 후, 세부정보를 확인하면 다음과 같습니다

파티션으로 분할된 테이블은 분할된 테이블이라는 설명도 나타나고, 아이콘도 미묘하게 다릅니다. 세부정보 하단에 파티션으로 나뉜 테이블인지, 어떤 파티션을 사용했는지가 나타납니다.



# 쿼리문을 사용해 파티션으로 분할된 빈 테이블 생성하기

CREATE TABLE
  mydataset.newtable (transaction_id INT64, transaction_date DATE)
PARTITION BY
  transaction_date
OPTIONS(
  require_partition_filter=true
)


# 쿼리 결과를 바로 파티션으로 분할된 테이블 생성하기

AS로 쿼리문을 나열하면 해당 쿼리를 실행하며 파티션으로 나뉜 테이블을 생성합니다.

CREATE TABLE
  mydataset.newtable (transaction_id INT64, transaction_date DATE)
PARTITION BY
  transaction_date
AS SELECT transaction_id, transaction_date FROM mydataset.mytable


# 샤딩된 테이블

날짜/타임스탬프로 파티션을 분할한 테이블이 아닌 Table 이름에 suffix를 붙여서 테이블을 샤딩할 수 있습니다

  • 예: firebase 데이터가 저장되는 analytics_XXX 데이터셋의 Table들(analytics_XXX.events_20200211 등)

참고로 날짜/타임스탬프로 파티션을 나눈 테이블이 샤딩된 테이블보다 성능이 뛰어납니다.

샤딩 테이블을 만들 땐 BigQuery가 각 테이블의 스키마 및 메타데이터 복사본을 유지해야 하고, 각 쿼리 대상 테이블의 권한을 확인해야 합니다

따라서 샤딩보다 날짜/타임스탬프로 파티션을 나눈 테이블 사용하는 것이 좋습니다. 샤딩된 테이블은 쿼리시 최대 1,000개의 테이블만 참조할 수 있고, 날짜/타임스탬프로 파티션을 나눈 테이블은 최대 4,000개의 파티션을 가질 수 있습니다.

더 자세한 내용이 궁금한 경우 BigQuery non-partition Table을 partition Table로 옮기기 (opens new window)을 참고해주세요