연속 구체화된 뷰 쿼리

Bigtable 테이블의 연속 구체화된 뷰를 만들려면 연속 구체화된 뷰를 정의하는 SQL 쿼리를 실행합니다.

이 문서에서는 연속 구체화된 뷰 SQL 쿼리를 준비하는 데 도움이 되는 개념과 패턴을 설명합니다. 이 문서를 읽기 전에 연속 구체화된 뷰Bigtable용 GoogleSQL을 숙지해야 합니다.

연속 구체화된 뷰는 제한된 SQL 구문을 사용합니다. 쿼리는 다음 패턴을 사용해야 합니다.

SELECT
  expression AS alias [, ...]
FROM from_item
[ WHERE bool_expression ]
GROUP BY expression [, ...]

from_item:
    {
      table_name [ as_alias ]
      | field_path
      }

as_alias:
    [ AS ] alias

쿼리 제한사항

연속 구체화된 뷰를 만드는 데 사용되는 SQL 쿼리에는 다음 규칙이 적용됩니다.

  • SELECT 문여야 합니다.
  • GROUP BY 절이 있어야 합니다.
  • 지원되는 집계 함수만 사용해야 함
  • 집계 열을 하나 이상 정의해야 함
  • 그룹당 여러 집계를 보유할 수 있음

지원되는 집계

연속 구체화된 뷰를 정의하는 SQL 쿼리에서 다음 집계 함수를 사용할 수 있습니다.

  • COUNT
  • SUM
  • MIN
  • MAX
  • HLL_COUNT.INIT
  • HLL_COUNT.MERGE
  • HLL_COUNT.MERGE_PARTIAL
  • ANY_VALUE
  • BIT_AND
  • BIT_OR
  • BIT_XOR
  • AVG

SELECT COUNT(*)인 경우 다음 예와 같이 행 키를 정의해야 합니다.

SELECT
  '*' AS _key,
  COUNT(*) AS count
FROM
  foo
GROUP BY
  _key;

지원되지 않는 SQL 기능

다음 SQL 기능은 사용할 수 없습니다.

  • Bigtable용 GoogleSQL에서 지원되지 않는 모든 기능
  • ARRAY
  • ARRAY_AGG
  • ARRAY_CONCAT_AGG
  • COUNT_IF
  • CURRENT_TIME 및 기타 비확정적 함수
  • DATE, DATETIME를 출력 열로 사용합니다 (TIMESTAMP를 사용하거나 문자열을 저장하세요).
  • 출력에서 DESC 정렬
  • DISTINCT 옵션(SUM(*DISTINCT* value) 참고)
  • LIMIT/OFFSET
  • ORDER BY
  • SELECT *
  • OVER 절: 창 집계 만들기
  • STRUCT

또한 GROUP BY 절을 중첩하거나 맵 열을 만들 수 없습니다. 추가 제한사항은 제한사항을 참고하세요.

제외된 행 피하기

다음과 같은 경우 입력 행이 연속 구체화된 뷰에서 제외됩니다.

  • 행에서 1MiB를 초과하는 데이터가 선택됩니다. 예를 들어 쿼리가 SELECT apple AS apples , SUM(banana) AS sum_bananas FROM my_table GROUP BY apples이면 applebanana 열에 1MiB가 넘는 데이터가 포함된 행은 연속 실체화된 뷰에서 제외됩니다.
  • 1MiB를 초과하는 데이터가 행에서 출력됩니다. 이는 SELECT REPEAT(apple, 1000)과 같은 쿼리를 사용하거나 큰 상수를 사용할 때 발생할 수 있습니다.
  • 선택한 것보다 10배가 넘는 데이터가 출력됩니다.
  • 쿼리가 데이터와 일치하지 않습니다. 여기에는 0으로 나누려고 시도하거나, 정수 오버플로가 발생하거나, 모든 행 키에 사용되지 않는 행 키 형식이 예상되는 경우가 포함됩니다.

제외된 행은 처음 처리될 때 사용자 오류 측정항목을 증가시킵니다. 연속 구체화된 뷰를 모니터링하는 데 도움이 되는 측정항목에 대한 자세한 내용은 측정항목을 참고하세요.

쿼리 세부정보

이 섹션에서는 연속 구체화된 뷰 쿼리와 뷰를 쿼리할 때 결과가 표시되는 방식을 설명합니다. 소스 테이블의 데이터는 입력이고 연속 실체화된 뷰의 결과 데이터는 출력입니다. 출력 데이터는 정의된 키에 따라 집계되거나 집계되지 않습니다.

SELECT 문

select 절은 연속 구체화된 뷰에 사용되는 열과 집계를 구성하며 GROUP BY 절을 사용해야 합니다.

SELECT *는 지원되지 않지만 SELECT COUNT(*)는 지원됩니다.

일반적인 SELECT 문과 마찬가지로 그룹화된 데이터 세트당 여러 집계를 가질 수 있습니다. 그룹화되지 않은 열은 집계 결과여야 합니다.

다음은 SQL의 표준 GROUP BY 집계 쿼리의 예입니다.

SELECT
  myfamily["node"] AS node,
  myfamily["type"] AS type,
  COUNT(clicks) AS clicks_per_key
FROM
  mytable
GROUP BY
  node,
  type

행 키 및 집계되지 않은 데이터

연속 구체화된 뷰를 정의할 때와 같이 원하는 경우 _key 출력 열을 지정할 수 있습니다. 이는 Bigtable 테이블에서 SQL 쿼리를 실행할 때 가져오는 _key과 다릅니다. _key를 지정하면 다음 규칙이 적용됩니다.

  • _key로 그룹화해야 하며 (선택적으로) _timestamp를 제외하고 다른 항목으로는 그룹화할 수 없습니다. 자세한 내용은 타임스탬프를 참고하세요.
  • _key 열은 BYTES 유형이어야 합니다.

_key를 지정하면 SQL이 아닌 ReadRows로 뷰를 읽으려는 경우에 유용합니다. 그러면 행 키 형식을 제어할 수 있기 때문입니다. 반면에 정의된 _key가 있는 뷰에 대한 SQL 쿼리는 구조화된 키 열을 반환하는 대신 _key를 명시적으로 디코딩해야 할 수 있습니다.

_key를 사용하지 않는 경우 SELECT 문의 집계되지 않은 열이 연속 구체화된 뷰의 키가 되며 키 열에 SQL 규칙에서 지원하는 모든 이름을 할당할 수 있습니다.

SQL 필터는 오류를 일으킬 수 있는 잠재적인 NULL 또는 기타 잘못된 값을 제거해야 합니다. 잘못된 행은 결과에서 생략되고 materialized_view/user_errors 측정항목에 집계됩니다. 사용자 오류를 디버그하려면 연속 구체화된 뷰 외부에서 SQL 쿼리를 실행해 보세요.

집계되지 않은 출력 열은 GROUP BY 절에 있어야 합니다. GROUP BY 절에 열이 쓰이는 순서는 연속 구체화된 뷰 행 키에 데이터가 저장되는 순서입니다. 예를 들어 GROUP BY a, b, c는 암시적으로 ORDER BY a ASC, b ASC, c ASC입니다.

집계된 데이터

쿼리의 집계 열은 연속 구체화된 뷰에서 데이터를 생성하는 계산을 정의합니다.

집계 열의 별칭은 연속 구체화된 뷰에서 열 한정자로 취급됩니다.

다음 예시를 참조하세요.

SELECT
  fam["baz"] AS baz,
  SUM(fam["foo"]) AS sum_foo,
  SUM(fam["bar"]) AS sum_bar
FROM
  TABLE
GROUP BY
  baz;

쿼리 출력의 특징은 다음과 같습니다.

  • baz의 출력은 baz ASC 순서로 별도의 행에 있습니다.
  • 지정된 bazfoo가 하나 이상 있으면 출력 행의 sum_foo는 NULL이 아닌 값입니다.
  • 지정된 bazbar가 하나 이상 있으면 출력 행의 sum_bar는 NULL이 아닌 값입니다.
  • 지정된 baz에 두 열 중 하나의 값이 없으면 결과에서 생략됩니다.

그런 다음 SELECT *로 뷰를 쿼리하면 다음과 유사한 결과가 표시됩니다.

baz sum_foo sum_bar
baz1 sum_foo1 sum_bar1
baz2 sum_foo2 sum_bar2

타임스탬프

연속 구체화된 뷰의 출력 셀에 대한 기본 타임스탬프는 0 (1970-01-01 00:00:00Z)입니다. 이는 SQL로 뷰를 쿼리할 때가 아니라 ReadRows로 뷰를 읽을 때 표시됩니다.

출력에서 다른 타임스탬프를 사용하려면 쿼리의 SELECT 목록에 TIMESTAMP 유형의 열을 추가하고 이름을 _timestamp로 지정하면 됩니다. ReadRows를 사용하여 연속 구체화된 뷰를 쿼리하면 _timestamp가 행의 다른 셀의 타임스탬프가 됩니다.

타임스탬프는 NULL이 아니어야 하며, 0 이상이어야 하며, 1,000의 배수여야 합니다 (밀리초 정밀도). Bigtable은 유닉스 시간 (1970-01-01T00:00:00Z) 이전의 셀 타임스탬프를 지원하지 않습니다.

일별로 집계 데이터를 리샘플링하는 다음 예를 살펴보세요. 이 쿼리는 UNPACK 함수를 사용합니다.

SELECT
  _key,
  TIMESTAMP_TRUNC(_timestamp, DAY) AS _timestamp,
  SUM(sum_family["sum_column"]) AS sum_column,
  SUM(sum_family["foo"]) AS second_sum_column
FROM
  UNPACK(
  SELECT
    *
  FROM
    my_table(with_history => TRUE))
GROUP BY
  1,
  2

지정된 SUM에 특정 날짜의 입력이 비어 있지 않으면 출력 행에는 잘린 날짜와 일치하는 타임스탬프가 포함된 집계 값이 포함됩니다.

SELECT *로 뷰를 쿼리하면 다음과 유사한 결과가 표시됩니다.

_key _timestamp sum_column second_sum_column
1 2024-05-01 00:00:00Z 23 99
2 2024-05-02 00:00:00Z 45 201
3 2024-05-03 00:00:00Z NULL 56
4 2024-05-04 00:00:00Z 8 NULL

인코딩

SQL로 구체화된 연속 뷰를 쿼리하는 경우 SQL이 결과를 유형이 지정된 열로 노출하므로 집계된 값이 인코딩되는 방식을 알 필요가 없습니다.

ReadRows를 사용하여 뷰에서 읽는 경우 읽기 요청에서 집계된 데이터를 디코딩해야 합니다. ReadRows 요청에 관한 자세한 내용은 읽기를 참고하세요.

연속 구체화된 뷰의 집계된 값은 뷰 정의의 열 출력 유형에 따라 다음 표에 설명된 인코딩을 사용하여 저장됩니다.

유형 인코딩
BOOL 1바이트 값, 1 = true, 0 = false
BYTES 인코딩 없음
INT64 (또는 INT, SMALLINT, INTEGER, BIGINT, TINYINT, BYTEINT) 64비트 big-endian
FLOAT64 64비트 IEEE 754(NaN 및 +/-inf 제외)
문자열 UTF-8
TIME/TIMESTAMP Unix epoch 이후 경과된 마이크로초 수를 나타내는 64비트 정수 (GoogleSQL과 일치)
자세한 내용은 Data API 참조의 인코딩을 참고하세요.

다음 단계