연속 구체화된 뷰 쿼리

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

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

구체화된 연속 뷰는 제한된 SQL 구문을 사용합니다. 다음 패턴은 구체화된 연속 뷰 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 쿼리를 전역 보조 색인으로 빌드하려면 ORDER BY 절을 사용하세요.

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

from_item:
    {
      table_name [ as_alias ]
      | field_path
      }

as_alias:
    [ AS ] alias

쿼리 제한사항

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

  • SELECT 문이어야 합니다.
  • GROUP BY 절이 있어야 합니다. 전역 보조 색인 쿼리의 경우 ORDER 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
  • SELECT *
  • OVER 절을 사용하여 윈도우 집계 만들기
  • STRUCT

GROUP BY 또는 ORDER 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 절을 사용하여 행을 집계하거나 ORDER 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를 지정할 수 있습니다. 그렇지 않으면 GROUP BY 절의 열이 뷰의 키를 형성합니다.

_key 열로 정의된 행 키

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

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

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

GROUP BY 또는 ORDER BY 절로 정의된 행 키

_key를 지정하지 않으면 SELECT 목록의 집계되지 않은 열이 뷰의 행 키가 됩니다. 키 열에 SQL 규칙에서 지원하는 이름을 할당할 수 있습니다. ReadRows 요청이 아닌 SQL을 사용하여 뷰를 쿼리하려는 경우 이 방법을 사용하세요.

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

GROUP BY 절 대신 ORDER BY 절을 사용하여 전역 보조 색인을 만드는 경우 ORDER BY 절에 포함된 SELECT 목록의 열이 뷰의 행 키가 됩니다. ORDER BY 절에 열이 작성되는 순서는 연속 구체화된 뷰 행 키에 데이터가 저장되는 순서입니다. 예를 들어 ORDER BY a, b, ca ASC, b ASC, c ASC 순으로 정렬된 row key를 사용하여 데이터를 저장합니다.

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

집계된 데이터

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

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

다음 예시를 참조하세요.

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)입니다. 이는 ReadRows로 뷰를 읽을 때는 표시되지만 SQL로 쿼리할 때는 표시되지 않습니다.

출력에서 다른 타임스탬프를 사용하려면 TIMESTAMP 유형의 열을 쿼리의 SELECT 목록에 추가하고 _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
시간/타임스탬프 Unix epoch 이후의 마이크로초 수를 나타내는 64비트 정수 (GoogleSQL과 일치)
자세한 내용은 Data API 참조의 인코딩을 참고하세요.

다음 단계