파티션을 나눈 테이블 소개

이 페이지에서는 BigQuery의 파티션을 나눈 테이블에 대해 간략하게 설명합니다.

파티션을 나눈 테이블은 파티션이라고 하는 세그먼트로 분할된 특수한 테이블로, 데이터를 보다 쉽게 관리하고 쿼리할 수 있게 해줍니다. 큰 테이블을 작은 파티션으로 나누면 쿼리 성능을 높일 수 있으며 쿼리에서 읽는 바이트 수를 줄여 비용을 제어할 수 있습니다.

다음을 기준으로 BigQuery 테이블을 여러 파티션으로 나눌 수 있습니다.

  • 시간 단위 열: 테이블의 TIMESTAMP, DATE 또는 DATETIME 열을 기준으로 테이블을 여러 파티션으로 나눕니다.

  • 수집 시간: BigQuery가 데이터를 수집하는 타임스탬프를 기준으로 테이블을 여러 파티션으로 나눕니다.

  • 정수 범위: 정수 열을 기준으로 테이블을 여러 파티션으로 나눕니다.

쿼리가 파티션 나누기 열의 값을 필터링하면 BigQuery가 필터와 일치하는 파티션을 스캔하고 나머지 파티션을 건너뛸 수 있습니다. 이 프로세스를 프루닝이라고 합니다.

시간 단위 열로 파티션 나누기

테이블의 DATE, TIMESTAMP 또는 DATETIME 열에서 테이블의 파티션을 나눌 수 있습니다. 테이블에 데이터를 쓰면 BigQuery는 열의 값을 기준으로 데이터를 올바른 파티션에 자동으로 넣습니다.

TIMESTAMPDATETIME 열의 파티션에는 시간별, 일별, 월간 또는 연간 세부사항이 포함될 수 있습니다. DATE 열의 파티션에는 일별, 월간 또는 연간 세부사항이 포함될 수 있습니다. 파티션 경계는 UTC 시간을 기반으로 합니다.

예를 들어 DATETIME 열에서 월별 파티션 나누기를 사용하여 테이블의 파티션을 나눈다고 가정해 보겠습니다. 테이블에 다음 값을 삽입하면 행이 다음 파티션에 기록됩니다.

열 값 파티션(월별)
DATETIME("2019-01-01") 201901
DATETIME("2019-01-15") 201901
DATETIME("2019-04-30") 201904

또한 두 개의 특수 파티션이 만들어집니다.

  • __NULL__: 파티션 나누기 열에 NULL 값이 있는 행을 포함합니다.
  • __UNPARTITIONED__: 파티션 나누기 열의 값이 1960-01-01 이전 또는 2159-12-31 이후인 행을 포함합니다.

수집 시간으로 파티션 나누기

수집 시간으로 파티션을 나눈 테이블을 만들면 BigQuery는 BigQuery가 데이터를 수집하는 시간을 기준으로 파티션에 자동으로 행을 할당합니다. 파티션에 대해 시간별, 일별, 월간 또는 연간 세부사항을 선택할 수 있습니다. 파티션 경계는 UTC 시간을 기반으로 합니다.

수집 시간으로 파티션을 나눈 테이블에는 _PARTITIONTIME이라는 유사 열이 있습니다. 이 열의 값은 파티션 경계(예: 시간별 또는 일별)로 잘린 각 행의 수집 시간입니다. 예를 들어 시간별로 파티션을 나누는 수집 시간으로 파티션을 나눈 테이블을 만들고 다음 시간에 데이터를 전송한다고 가정해 보겠습니다.

수집 시간 _PARTITIONTIME 파티션(시간별)
2021-07-05 17:22:00 2021-05-07 17:00:00 2021050717
2021-07-05 17:40:00 2021-05-07 17:00:00 2021050717
2021-07-05 18:31:00 2021-05-07 18:00:00 2021050718

이 예시의 테이블은 시간별 파티션 나누기를 사용하므로 _PARTITIONTIME 값은 시간 경계로 잘립니다. BigQuery는 이 값을 사용하여 데이터에 적합한 파티션을 결정합니다.

또한 특정 파티션에 데이터를 쓸 수도 있습니다. 예를 들어 이전 데이터를 로드하거나 시간대에 맞게 조정해야 할 수 있습니다. 0001-01-01과 9999-12-31 사이의 유효한 날짜를 사용할 수 있습니다. 그러나 DML 문은 1970-01-01 이전 또는 2159-12-31 이후의 날짜를 참조할 수 없습니다. 자세한 내용은 특정 파티션에 데이터 쓰기를 참조하세요.

정수 범위로 파티션 나누기

특정 INTEGER 열의 값 범위를 기준으로 테이블의 파티션을 나눌 수 있습니다. 정수 범위로 파티션을 나눈 테이블을 만들려면 다음을 지정해야 합니다.

  • 파티션 나누기 열
  • 파티션 나누기 범위의 시작 값(해당 값 포함)
  • 파티션 나누기 범위의 종료 값(해당 값 제외)
  • 파티션 내 각 범위의 간격

예를 들어 다음 사양을 사용하여 정수 범위 파티션을 만든다고 가정하겠습니다.

인수
열 이름 customer_id
시작 0
end 100
interval 10

이 테이블은 customer_id 열을 기준으로 간격 10의 범위로 파티션이 나눠집니다. 0~9 값을 하나의 파티션에 포함하고, 10~19 값을 다음 파티션에 포함하고, 이런 방식으로 최대 99까지 포함합니다. 이 범위를 벗어나는 값은 __UNPARTITIONED__라는 파티션에 포함되고 customer_idNULL인 모든 행은 __NULL__라는 파티션에 포함됩니다.

일별, 시간별, 월간 또는 연간 파티션 나누기를 선택합니다.

시간 단위 열 또는 수집 시간을 기준으로 테이블의 파티션을 나눌 때 파티션에 일별, 시간별, 월간, 연간 세부사항을 포함할지 선택합니다.

  • 일변 파티션 나누기는 기본 파티션 나누기 유형입니다. 일별 파티션 나누기는 데이터가 긴 기간에 걸쳐 있거나 시간이 지남에 따라 데이터가 계속 추가되는 경우에 적합합니다.

  • 테이블에 단기간(일반적으로 타임스탬프 값이 6개월 미만)에 걸쳐 있는 데이터가 많은 경우 시간별 파티션 나누기를 선택합니다. 시간별 파티션 나누기를 선택할 경우 파티션 수가 파티션 한도 내에 있는지 확인합니다.

  • 테이블의 일별 데이터 양이 상대적으로 적지만 긴 기간에 걸쳐 있는 경우 월간 또는 연간 파티션 나누기를 선택합니다. 워크플로가 긴 기간(예: 500개가 넘는 날짜)에 걸쳐 있는 행을 자주 업데이트하거나 추가해야 하는 경우 이 옵션을 사용하는 것이 좋습니다. 이러한 시나리오에서는 파티션 나누기 열의 클러스터링과 함께 월간 또는 연간 파티션 나누기를 사용하여 최고의 성능을 달성합니다. 자세한 내용은 이 페이지의 파티션 나누기와 클러스터링을 참조하세요.

파티션 나누기와 클러스터링 비교

파티션 나누기와 클러스터링 모두 성능을 개선하고 쿼리 비용을 줄일 수 있습니다.

다음과 같은 상황에서 클러스터링을 사용합니다.

  • 쿼리를 실행하기 전 엄격한 비용 보장이 필요하지 않습니다.
  • 파티셔닝 단독으로 허용되는 것보다 많은 세부사항이 필요합니다. 파티션 나누기 이점 외에도 클러스터링 이점을 얻기 위해 파티셔닝 및 클러스터링 모두에 동일한 열을 사용할 수 있습니다.
  • 쿼리는 일반적으로 여러 특정 열에 대해 필터 또는 집계를 사용합니다.
  • 열 또는 열 그룹에 있는 값 수의 카디널리티가 큽니다.

다음과 같은 경우에 파티션 나누기를 사용합니다.

  • 쿼리를 실행하기 전에 쿼리 비용을 확인하려고 합니다. 쿼리 실행 전에 파티션 프루닝이 수행되므로 테스트 실행을 통해 파티션 프루닝 후 쿼리 비용을 확인할 수 있습니다. 클러스터 프루닝은 쿼리 실행 시 수행되므로 쿼리가 완료되어야만 비용을 알 수 있습니다.

  • 파티션 수준 관리가 필요합니다. 예를 들어 파티션 만료 시간을 설정하거나 데이터를 특정 파티션에 로드하거나 파티션을 삭제합니다.

  • 데이터를 여러 파티션으로 나눌 방법과 각 파티션에 저장할 데이터를 지정하려고 합니다. 예를 들어 시간 단위를 정의하거나 정수 범위로 파티션을 나누기 위해 테이블을 파티션으로 나누는 데 사용할 범위를 정의할 수 있습니다.

다음과 같은 경우 파티션 나누기보다 클러스터링이 선호됩니다.

  • 파티션을 나누면 파티션당 소량의 데이터가 생성됩니다(1GB 미만).
  • 파티션 나누기를 사용하면 파티션을 나눈 테이블의 한도를 넘어서 많은 파티션 수가 생성됩니다.
  • 파티션을 나누면 변형 작업이 테이블의 파티션 대부분을 빈번히(예: 몇 분마다) 수정합니다.

파티션 나누기를 클러스터링과 결합할 수도 있습니다. 데이터는 먼저 파티션을 나눈 다음 각 파티션의 데이터는 클러스터링 열에서 클러스터링됩니다.

테이블 쿼리 시 파티션 나누기는 파티션 프루닝에 따라 쿼리 비용의 상한을 설정합니다. 클러스터 프루닝으로 인해 쿼리가 실제로 실행될 때는 다른 쿼리 비용이 절감될 수도 있습니다.

파티션 나누기와 분할 비교

테이블 샤딩은 [PREFIX]_YYYYMMDD와 같은 이름 프리픽스를 사용하여 여러 테이블에 데이터를 저장하는 방법입니다.

파티션을 나눈 테이블이 성능이 더 우수하므로 테이블 샤딩보다 파티션 나누기를 권장합니다. 샤딩된 테이블의 경우 BigQuery는 각 테이블의 스키마와 메타데이터의 복사본을 유지관리해야 합니다. 또한 BigQuery는 쿼리된 각 테이블의 권한을 확인해야 할 수 있습니다. 이 때문에 쿼리 오버헤드도 추가되고 쿼리 성능에 영향을 미칩니다.

이전에 날짜로 샤딩된 테이블을 만든 경우 이 테이블을 수집 시간으로 파티션을 나눈 테이블로 변환할 수 있습니다. 자세한 내용은 날짜로 샤딩된 테이블을 수집 시간으로 파티션을 나눈 테이블로 변환을 참조하세요.

제한사항

legacy SQL로는 파티션을 나눈 테이블을 쿼리하거나 쿼리 결과를 파티션을 나눈 테이블에 쓸 수 없습니다.

시간 단위 열로 파티션을 나눈 테이블에는 다음과 같은 제한사항이 적용됩니다.

  • 파티션 나누기 열은 스칼라 DATE, TIMESTAMP 또는 DATETIME 열이어야 합니다. 열의 모드는 REQUIREDNULLABLE일 수는 있지만 REPEATED(배열 기반)이어서는 안 됩니다.
  • 파티션 나누기 열은 최상위 필드여야 합니다. RECORD(STRUCT)의 리프 필드는 파티션 나누기 열로 사용할 수 없습니다.

정수 범위로 파티션을 나눈 테이블에는 다음과 같은 제한사항이 적용됩니다.

  • 파티션 나누기 열은 INTEGER 열이어야 합니다. 열의 모드는 REQUIREDNULLABLE일 수는 있지만 REPEATED(배열 기반)여서는 안 됩니다.
  • 파티션 나누기 열은 최상위 필드여야 합니다. RECORD(STRUCT)의 리프 필드는 파티션 나누기 열로 사용할 수 없습니다.

파티션을 나눈 테이블의 할당량 및 한도

BigQuery에서 파티션을 나눈 테이블에는 한도가 정의되어 있습니다.

할당량과 한도는 다음을 포함하여 파티션을 나눈 테이블을 대상으로 실행할 수 있는 여러 작업 유형에도 적용됩니다.

모든 할당량 및 한도에 대한 자세한 내용은 할당량 및 한도를 참조하세요.

파티션을 나눈 테이블 가격

BigQuery에서 파티션을 나눈 테이블을 만들고 사용할 때 부과되는 비용은 파티션에 저장되는 데이터와 데이터를 대상으로 실행하는 쿼리의 양에 따라 결정됩니다.

  • 저장소 가격에 대한 자세한 내용은 저장소 가격을 참조하세요.
  • 쿼리 가격에 대한 자세한 내용은 쿼리 가격을 참조하세요.

파티션에 데이터 로드하기, 파티션 복사, 파티션에서 데이터 내보내기를 포함하여 파티션을 나눈 테이블 작업 중 많은 작업이 무료입니다. 이러한 작업은 무료지만 BigQuery의 할당량 및 한도가 적용됩니다. 모든 무료 작업에 대한 자세한 내용은 가격 책정 페이지의 무료 작업을 참조하세요.

다음 단계