연속 구체화된 뷰 쿼리
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
이면apple
및banana
열에 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
순서로 별도의 행에 있습니다. - 지정된
baz
에foo
가 하나 이상 있으면 출력 행의sum_foo
는 NULL이 아닌 값입니다. - 지정된
baz
에bar
가 하나 이상 있으면 출력 행의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과 일치) |