파티션을 나눈 테이블 소개

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

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

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

  • 수집 시간: 데이터의 수집(로드) 날짜 또는 도착 날짜를 기준으로 테이블을 여러 파티션으로 나눕니다.

  • 날짜/타임스탬프: TIMESTAMP 또는 DATE 열을 기준으로 테이블을 여러 파티션으로 나눕니다.

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

수집 시간으로 파티션을 나눈 테이블

내부 데이터화 시간으로 파티션을 나눈 테이블을 만들면 BigQuery에서 자동으로 데이터의 내부 데이터화 또는 도착 날짜를 반영하는 일 단위의 날짜 기준 파티션으로 데이터를 로드합니다. 유사 열 및 서픽스 식별자를 사용하면 특정 날짜의 데이터를 수정(교체)하고 데이터를 파티션으로 리디렉션할 수 있습니다.

수집 시간으로 파티션을 나눈 테이블에는 _PARTITIONTIME이라는 유사 열이 포함되며 이 열에는 테이블에 로드되는 데이터의 날짜 기반 타임스탬프가 포함됩니다. 시간으로 파티션을 나눈 테이블에 대한 쿼리에서는 파티션의 위치를 나타내는 _PARTITIONTIME 필터를 제공하여 데이터 읽기를 제한할 수 있습니다. 쿼리를 통해 지정한 파티션의 모든 데이터를 읽을 수 있지만 스캔되는 파티션의 수는 조건자 필터인 _PARTITIONTIME에 따라 제한됩니다.

수집 시간으로 파티션을 나눈 테이블을 만들 때 파티션에는 테이블과 동일한 스키마 정의가 포함됩니다. 테이블과 다른 스키마를 사용하여 파티션에 데이터를 로드해야 하는 경우에는 데이터를 로드하기 전에 테이블의 스키마를 업데이트해야 합니다. 또는 스키마 업데이트 옵션을 사용하여 로드 작업 또는 쿼리 작업에서 테이블의 스키마를 업데이트합니다.

날짜 또는 타임스탬프로 파티션을 나눈 테이블

BigQuery에서는 특정 DATE 또는 TIMESTAMP 열을 기준으로 파티션을 나눈 테이블도 허용됩니다. 날짜/타임스탬프로 파티션을 나눈 테이블에 기록된 데이터는 파티션 나누기 열의 날짜 값(UTC)을 기준으로 적절한 파티션에 자동으로 전달됩니다.

날짜/타임스탬프로 파티션을 나눈 테이블의 각 파티션은 하나의 범위로 간주할 수 있으며, 범위의 시작은 날짜의 시작이 되고 범위 간격은 하루가 됩니다.

날짜/타임스탬프로 파티션을 나눈 테이블에는 유사 열 _PARTITIONTIME이 필요하지 않습니다. 날짜/타임스탬프로 파티션을 나눈 테이블에 대한 쿼리에서는 파티션 나누기 열을 기준으로 한 조건자 필터를 지정하여 스캔되는 데이터의 양을 줄일 수 있습니다.

날짜/타임스탬프로 파티션을 나눈 테이블을 만들면 다음과 같은 두 개의 특수 파티션이 만들어집니다.

  • __NULL__ 파티션: 파티션 나누기 열에 NULL 값이 있는 행을 나타냅니다.
  • __UNPARTITIONED__ 파티션: 허용된 날짜 범위 밖에 있는 데이터를 나타냅니다.

__NULL____UNPARTITIONED__ 파티션을 제외하고 파티션 나누기 열의 모든 데이터는 파티션 식별자의 날짜와 일치합니다. 따라서 쿼리를 통해 필터 조건을 충족하는 데이터가 없는 파티션을 확인할 수 있습니다. 파티션 나누기 열을 기준으로 데이터를 필터링하는 쿼리로 값을 제한하고 불필요한 파티션을 완전히 프루닝할 수 있습니다.

날짜/타임스탬프로 파티션 나누기와 샤딩 비교

날짜/타임스탬프로 파티션을 나눈 테이블 대신 [PREFIX]_YYYYMMDD와 같은 시간 기반 명명 방식을 사용해 테이블을 샤딩할 수도 있습니다. 이를 날짜로 샤딩된 테이블 만들기라고 합니다. 표준 SQL 또는 legacy SQL을 사용하면 UNION 연산자가 포함된 쿼리를 지정하여 쿼리로 스캔하는 테이블을 제한할 수 있습니다.

날짜/타임스탬프로 파티션을 나눈 테이블은 날짜로 샤딩된 테이블보다 성능이 뛰어납니다. 날짜로 이름이 지정된 테이블을 만들 때는 BigQuery가 날짜로 이름이 지정된 각 테이블의 스키마 및 메타데이터 복사본을 유지관리해야 합니다. 또한 날짜로 이름이 지정된 테이블을 사용하는 경우에는 BigQuery가 각 쿼리 대상 테이블의 권한을 확인해야 할 수 있습니다. 이 때문에 쿼리 오버헤드가 추가되고 쿼리 성능에 영향을 미칩니다. 따라서 날짜로 샤딩된 테이블 대신 날짜/타임스탬프로 파티션을 나눈 테이블을 사용하는 것이 좋습니다.

파티션 나누기 옵션 비교

다음 표에서는 샤딩된 테이블과 날짜/타임스탬프로 파티션을 나눈 테이블을 비교합니다.

기능 분할된 테이블 수집 시간으로 파티션을 나눈 테이블 파티션을 나눈 테이블
파티션 나누기 방법 없음: 테이블을 샤딩하고 UNION 연산자를 사용하여 테이블을 쿼리하면 파티션 나누기를 시뮬레이션할 수 있습니다. 데이터의 수집 또는 도착 날짜를 기준으로 파티션을 나눕니다. 파티션 정보는 유사 열을 사용하여 참조할 수 있습니다. 지정된 TIMESTAMP 또는 DATE 열의 데이터를 기준으로 파티션을 나눕니다.
파티션 식별자 없음 0001-01-01과 9999-12-31 사이의 유효한 날짜를 사용할 수 있지만 DML 문은 1970-01-01 이전 또는 2159-12-31 이후의 날짜를 참조할 수 없습니다. 바인딩된 DATE 또는 TIMESTAMP 열의 유효한 항목. 현재 1960-01-01 이전의 날짜 값과 2159-12-31 이후의 날짜 값은 공유된 UNPARTITIONED 파티션에 배치됩니다. NULL 값은 명시적인 NULL 파티션에 저장됩니다.
스캔되는 데이터 제한 쿼리에서 불필요한 열을 제외하여 필요한 샤드만 참조하고 데이터를 제한합니다. _PARTITIONTIME 유사 열을 사용하여 파티션을 프루닝합니다. 파티션 나누기 열에서 조건자 필터를 사용합니다.
파티션 개수 테이블의 개수는 무제한이지만, 쿼리는 최대 1,000개의 테이블만 참조할 수 있습니다. 최대 4,000개의 파티션 최대 4,000개의 파티션
업데이트 작업 업데이트는 하루에 1,000회로 제한됩니다. 개별 작업으로 단일 파티션에 커밋할 수 있습니다. 가장 최근의 파티션(기본값) 또는 [TABLE]$[DATE]와 같은 파티션 데코레이터를 사용하여 지정된 파티션에 커밋합니다. 개별 작업으로 최대 2,000개의 개별 파티션에 데이터를 커밋할 수 있습니다.
스트리밍 삽입 테이블에 하나의 글로벌 버퍼 사용. 파티션 서픽스를 사용하여 현재 UTC 시간의 현재 날짜를 기준으로 지난 31일 및 향후 16일 이내의 파티션으로 스트리밍할 수 있습니다. 지난 1년에서 향후 6개월 사이의 데이터를 스트리밍할 수 있습니다. 이 범위를 벗어나는 날짜는 거부됩니다. 데이터가 스트리밍될 때 지난 7일에서 향후 3일 사이의 데이터는 스트리밍 버퍼에 배치된 다음 해당 파티션으로 추출됩니다. 이 시간대를 벗어나는(단, 1년 이내의 6개월 범위) 데이터는 UNPARTITIONED 파티션에 배치됩니다. 파티션으로 나누지 않은 데이터가 충분한 경우 해당 파티션으로 로드됩니다.
시간대 평가 사용자 의미 체계로 정의됨 UTC UTC

정수 범위로 파티션을 나눈 테이블

BigQuery에서는 특정 INTEGER 열을 기준으로 사용자가 선택한 시작, 끝 및 간격 값에 따라 파티션을 나눈 테이블이 허용됩니다. 정수 범위로 파티션을 나눈 테이블에 대한 쿼리에서는 파티션 나누기 열을 기준으로 한 조건자 필터를 지정하여 스캔되는 데이터의 양을 줄일 수 있습니다.

정수 범위로 파티션을 나눈 테이블을 만들려면 다음을 지정해야 합니다.

  • 정수 범위 파티션을 만드는 데 사용되는 열
  • 파티션 나누기 범위의 시작(해당 값 포함)
  • 파티션 나누기 범위의 끝(해당 값 제외)
  • 파티션 내 각 범위의 간격

테이블의 범위를 벗어나는 값은 UNPARTITIONED 파티션으로 이동합니다.

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

인수
열 이름 customer_id
start 0
end 100
interval 10

이 경우 테이블은 customer_id 열을 기준으로 간격 10의 범위로 파티션이 나눠집니다. 0~9 값을 하나의 파티션에 저장하고, 10~19 값을 또 다른 파티션에 저장하는 식으로 진행하여 마지막 90~99 값까지 개별 파티션에 저장합니다. -1 또는 100과 같이 0~99 범위를 벗어나는 값은 UNPARTITIONED 파티션에 저장됩니다. Null 값은 NULL 파티션에 저장됩니다.

정수 범위로 파티션을 나눈 테이블을 만들면 다음과 같은 두 개의 특수 파티션이 만들어집니다.

  • __NULL__ 파티션: 파티션 나누기 열에 NULL 값이 있는 행을 나타냅니다.
  • __UNPARTITIONED__ 파티션: 정수 시작 및 간격의 허용 범위 밖에 있는 데이터를 나타냅니다.

__NULL____UNPARTITIONED__ 파티션을 제외하고 파티션 나누기 열의 모든 데이터는 정수 시작 및 간격의 범위 내에 있습니다. 따라서 쿼리를 통해 필터 조건을 충족하는 데이터가 없는 파티션을 확인할 수 있습니다. 파티션 나누기 열에서 데이터를 필터링하는 쿼리는 값을 제한하고 불필요한 파티션을 완전히 프루닝할 수 있습니다.

시작 값과 끝 값 사이의 가능한 범위 수 한도는 10,000개입니다. 하지만 각 범위가 파티션이 되므로 데이터가 있는 범위의 수는 테이블당 파티션 4,000개로 제한됩니다.

정수 범위로 파티션 나누기와 클러스터링 비교

정수 범위로 파티션 나누기와 클러스터링은 모두 성능을 높이고 쿼리 비용을 줄일 수 있습니다. 하지만 주요 차이점이 있으며 각각의 사용 사례도 다릅니다.

정수 범위로 파티션 나누기는 다음과 같은 경우에 사용합니다.

  • 테이블을 파티션으로 나누는 데 사용되는 범위를 명시적으로 정의하려는 경우. 데이터를 여러 파티션으로 나눌 방법과 각 파티션에 저장할 데이터를 지정합니다.

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

  • 파티션을 처리(예: 데이터를 특정 파티션에 로드)하거나 특정 파티션의 데이터를 완전 삭제하려는 경우

클러스터링은 다음과 같은 경우에 사용합니다.

  • 성능 개선 및 비용 절감을 실현할 수 있는 한 데이터가 클러스터링되는 방식은 중요하지 않은 경우. BigQuery는 최적의 성능과 비용을 위해 데이터를 클러스터링할 방식을 자동으로 파악합니다.

  • 필요한 파티션이 4,000개를 초과하는 경우. BigQuery에서 파티션을 나눈 테이블의 파티션은 4,000개로 제한됩니다. 하지만 테이블의 클러스터 수에는 제한이 없습니다.

동일한 정수 열을 기준으로 파티션을 나누고 클러스터링하면 둘의 이점을 모두 누릴 수 있습니다. 먼저 데이터를 지정된 정수 범위에 따라 여러 파티션으로 나눕니다. 각 범위 내에서 데이터 양이 충분히 크면 데이터 클러스터링도 수행합니다. 테이블 쿼리 시 파티션 나누기는 파티션 프루닝에 따라 쿼리 비용의 상한을 설정합니다. 쿼리가 실제로 실행될 때는 다른 면에서 추가로 쿼리 비용이 절감될 수도 있습니다.

require_partitioning_filter 사용

정수 범위로 파티션을 나누는 기능이 출시됨에 따라 이제 BigQuery는 다음과 같은 여러 유형의 파티션 나누기를 지원합니다.

  • 수집 시간
  • 날짜/타임스탬프
  • 정수 범위

BigQuery API를 간소화하기 위해 require_partitioning_filter 매개변수는 파티션 나누기 유형 수준에서 테이블 수준으로 이동되었습니다. 하지만 날짜/타임스탬프로 파티션 나누기의 하위 호환성을 위해 파티션 수준에서 require_partitioning_filter가 계속 지원됩니다. 테이블 수준에서 이 매개변수를 지정할 수도 있습니다. 정수 범위로 파티션 나누기의 경우에는 테이블 수준에서만 require_partitioning_filter를 지정할 수 있습니다. bq 명령줄 도구는 이미 테이블 수준 옵션을 사용하므로 bq 명령어를 사용하는 방식에 아무 변경사항도 없습니다. BigQuery API를 사용한다면 테이블 수준에서 require_partitioning_filter 옵션을 사용해야 합니다.

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

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

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

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

파티션을 나눈 테이블 가격

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

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

다음 단계