동적 테이블 새로 고침 이해하기¶
동적 테이블 콘텐츠는 특정 쿼리의 결과를 기반으로 합니다. 동적 테이블의 기반이 되는 기본 데이터가 변경되면 해당 변경 사항을 반영하도록 테이블이 업데이트됩니다. 이러한 업데이트를 새로 고침 이라고 합니다. 이 프로세스는 자동화되어 있으며 테이블의 기반이 되는 쿼리를 분석하는 작업을 포함합니다.
동적 테이블 새로 고침 시간 초과는 STATEMENT_TIMEOUT_IN_SECONDS 매개 변수에 의해 결정되며 자동으로 취소되기 전 계정 또는 웨어하우스의 최대 기간을 정의합니다.
다음 섹션에서는 동적 테이블 새로 고침을 더 자세히 설명합니다.
동적 테이블 새로 고침 모드¶
동적 테이블 새로 고침 프로세스는 다음 두 가지 방식 중 하나로 작동합니다.
증분 새로 고침: 이 자동화된 프로세스에서는 동적 테이블의 쿼리를 분석하고 마지막 새로 고침 이후의 변경 사항을 계산합니다. 그런 다음 이러한 변경 사항을 테이블에 병합합니다. 지원되는 쿼리에 대한 자세한 내용은 증분 새로 고침에서 지원되는 쿼리 섹션을 참조하십시오.
전체 새로 고침: 자동화된 프로세스가 증분 새로 고침을 수행할 수 없는 경우 전체 새로 고침을 수행합니다. 여기에는 동적 테이블에 대한 쿼리를 실행하고 이전에 구체화된 결과를 완전히 바꾸는 작업이 포함됩니다.
쿼리에 사용된 구문에 따라 증분 새로 고침을 사용할 수 있는지 결정됩니다. 동적 테이블을 만든 후 테이블을 모니터링 하여 증분 또는 전체 새로 고침이 해당 테이블을 업데이트하는 데 사용되는지 여부를 결정할 수 있습니다.
목표 지연 이해하기¶
동적 테이블 새로 고침은 데이터가 얼마나 오래되었는지, 즉 일반적으로 목표 지연 이라고 하는 시간에 따라 트리거됩니다. 동적 테이블의 목표 지연은 바로 위쪽의 동적 테이블이 아니라 그래프의 루트에 있는 기본 테이블을 기준으로 측정됩니다. Snowflake 일정은 동적 테이블의 실제 지연을 목표 지연보다 낮게 유지하도록 새로 고침을 예약합니다. 각 새로 고침의 기간은 쿼리, 데이터 패턴, 웨어하우스 크기에 따라 달라집니다. 목표 지연을 선택할 때는 체인의 각 동적 테이블 을 루트까지 새로 고치는 데 필요한 시간을 고려하십시오. 그렇지 않으면 일부 새로 고침을 건너뛰어 실제 지연이 더 커질 수 있습니다.
동적 테이블에 연결된 테이블의 그래프를 보려면 Snowsight를 사용하여 동적 테이블의 그래프 조사하기 섹션을 참조하십시오.
목표 지연은 다음 중 한 가지 방법으로 지정됩니다.
최신성 척도: 동적 테이블의 콘텐츠가 기본 테이블에 대한 업데이트보다 지연되어야 하는 최대 시간을 정의합니다.
다음 예제에서는
product
동적 테이블을 매시간 새로 고치고 최신성을 유지하도록 설정합니다.ALTER DYNAMIC TABLE product SET TARGET_LAG = '1 hour';다운스트림: 다른 종속 동적 테이블이 새로 고쳐질 때 동적 테이블을 필요에 따라 새로 고치도록 지정합니다. 이 새로 고침은 다운스트림 동적 테이블의 수동 또는 예약된 새로 고침을 통해 트리거될 수 있습니다.
다음 예제에서
product
는 다른 동적 테이블을 기반으로 하며 다운스트림 동적 테이블의 목표 지연에 따라 새로 고침되도록 설정되어 있습니다.ALTER DYNAMIC TABLE product SET TARGET_LAG = DOWNSTREAM;
목표 지연은 동적 테이블의 새로 고침 빈도에 반비례하며, 자주 새로 고칠수록 지연이 줄어듭니다.
동적 테이블 1(DT1)을 기반으로 동적 테이블 2(DT2)를 정의하는 다음 예를 살펴보십시오. DT2는 DT1에서 읽어 그 내용을 구체화해야 합니다. 또한 보고서는 쿼리를 통해 DT2 데이터를 사용합니다.

각각의 동적 테이블이 지연을 지정하는 방식에 따라 다음 결과가 가능합니다.
DT1(동적 테이블 1) |
DT2(동적 테이블 2) |
새로 고침 결과 |
---|---|---|
|
|
DT2는 최대 10분마다 업데이트됩니다. DT1은 DT2에서 지연을 추론하고 DT2가 업데이트가 필요할 때마다 업데이트됩니다. |
|
|
이런 상황을 방지해야 합니다. 보고서 쿼리는 어떤 데이터도 수신하지 않습니다. DT 1은 자주 새로 고쳐지며, DT2는 DT2를 기반으로 하는 동적 테이블이 없기 때문에 새로 고쳐지지 않습니다. |
|
|
DT2는 약 10분마다 DT1에서 길어야 5분 이내의 최신 데이터로 업데이트됩니다. |
|
|
DT1은 지연이 정의된 다운스트림 하위 항목이 없으므로 DT2가 주기적으로 새로 고쳐지지 않습니다. |
증분 새로 고침에서 지원되는 쿼리¶
다음 표에는 현재 증분 새로 고침을 지원하는 식, 키워드, 절에 대해 설명되어 있습니다. 증분 새로 고침을 지원하지 않는 쿼리 목록은 증분 새로 고침 지원 제한 사항 을 참조하십시오.
키워드/절 |
증분 새로 고침 지원 |
---|---|
WITH |
하위 쿼리에서 증분 새로 고침 지원 기능을 사용하는 CTE(공통 테이블 식). |
SELECT의 식 |
|
FROM |
원본 테이블, 뷰, 기타 동적 테이블. FROM 절 외부의 하위 쿼리(예: WHERE EXISTS)는 지원되지 않습니다. |
OVER |
모든 윈도우 함수. |
WHERE/HAVING/QUALIFY |
SELECT에서 유효한 동일한 식이 있는 필터. |
JOIN(그리고 테이블 조인을 위한 다른 식) |
증분 새로 고침에 지원되는 조인 유형에는 내부 조인, 외부 동등 조인, 교차 조인 및 측면 데이터 스큐(비정적 FLATTEN 테이블 함수만 해당)가 있습니다. 조인에서 원하는 수의 테이블을 지정할 수 있으며 조인의 모든 테이블에 대한 업데이트는 쿼리 결과에 반영됩니다. 증분 새로 고침에는 래터럴 데이터 스큐 조인에서 데이터 스큐 SEQ 열의 선택이 지원되지 않습니다. |
UNION ALL |
동적 테이블이 UNION ALL을 지원합니다. |
GROUP BY |
동적 테이블이 GROUP BY를 지원합니다. |
중요
쿼리에서 증분 새로 고침에 지원되지 않는 식을 사용하는 경우 자동 새로 고침 프로세스는 전체 새로 고침을 사용하며 그에 따른 비용이 추가로 발생할 수 있습니다. 사용되는 새로 고침 모드를 확인하려면 증분 또는 전체 새로 고침이 사용되는지 확인하기 섹션을 참조하십시오.
증분 새로 고침을 사용하는 동적 테이블에서 사용 중인 IMMUTABLE 사용자 정의 함수(UDF)를 바꾸면 해당 테이블에서 정의되지 않은 동작이 발생합니다. VOLATILE UDF는 증분 새로 고침에서는 지원되지 않습니다.
현재 증분 새로 고침에서는 래터럴 조인이 지원되지 않습니다. 하지만 새로 고침 모드를 INCREMENTAL
로 설정하여 LATERAL을 FLATTEN() 과 함께 사용할 수 있습니다.
예:
CREATE TABLE persons
AS
SELECT column1 AS id, parse_json(column2) AS entity
FROM values
(12712555,
'{ name: { first: "John", last: "Smith"},
contact: [
{ business:[
{ type: "phone", content:"555-1234" },
{ type: "email", content:"j.smith@company.com" } ] } ] }'),
(98127771,
'{ name: { first: "Jane", last: "Doe"},
contact: [
{ business:[
{ type: "phone", content:"555-1236" },
{ type: "email", content:"j.doe@company.com" } ] } ] }') v;
CREATE DYNAMIC TABLE example
TARGET_LAG = DOWNSTREAM
WAREHOUSE = mywh
REFRESH_MODE = INCREMENTAL
AS
SELECT p.id, f.value, f.path
FROM persons p,
LATERAL FLATTEN(input => p.entity) f;
참고
증분 새로 고침에는 래터럴 데이터 스큐 조인에서 데이터 스큐 SEQ 열의 선택이 지원되지 않습니다.
연산자의 증분 새로 고침 방법¶
다음 테이블에는 각 연산자가 증분되는 방식(즉, 전체 결과 대신 변경 사항을 생성하는 새로운 쿼리 조각으로 변환되는 방식)과 성능 및 기타 고려해야 할 중요한 요소가 간략하게 설명되어 있습니다.
연산자 |
증분 |
고려 사항 |
---|---|---|
SELECT <스칼라 식> |
변경된 행에 식을 적용하여 증분됩니다. |
특별히 고려할 점은 없고, 성능이 우수합니다. |
WHERE <스칼라 식> |
변경된 각 행에서 술어를 평가하고 술어가 true인 행만 포함하여 증분합니다. |
일반적으로 성능이 우수합니다. 비용은 변경의 크기에 따라 선형적으로 증가합니다. 선택성이 높은 WHERE 식을 사용하여 동적 테이블을 새로 고치면 결과 동적 테이블이 변경되지 않더라도 웨어하우스 작동 시간이 필요할 수 있습니다. 이는 원본에서 어떤 변경 사항이 술어를 만족하는지 확인하기 위해 웨어하우스가 필요할 수 있기 때문입니다. |
FROM <베이스 테이블> |
마지막 새로 고침 이후 테이블에 추가되거나 제거된 마이크로 파티션을 스캔하여 증분합니다. |
비용은 추가되거나 제거된 마이크로 파티션의 데이터 양에 따라 선형적으로 증가합니다. 권장 사항:
|
<쿼리> UNION ALL <쿼리> |
양쪽의 모든 변경 사항에 대해 union-all을 수행하여 증분합니다. |
특별히 고려할 점은 없고, 성능이 우수합니다. |
WITH <CTE 목록> <쿼리> |
각 공통 테이블 식의 변경 사항을 계산하여 증분합니다. |
WITH를 사용하면 복잡한 쿼리를 더 쉽게 읽을 수 있지만, 단일 동적 테이블의 정의를 너무 복잡하게 만들지 않도록 유의합니다. 자세한 내용은 동적 테이블의 파이프라인 연결 및 복잡한 동적 테이블에 대한 증분 새로 고침 모드 성능 최적화 섹션을 참조하십시오. |
스칼라 집계 |
스칼라 집계는 현재 효율적으로 증분되지 않습니다. 입력 내용이 변경되면 완전히 다시 계산됩니다. |
|
GROUP BY <키> |
변경된 모든 그룹화 키에 대한 집계를 다시 계산하여 증분합니다. |
원본 데이터가 그룹화 키로 클러스터링되어 있고 변경 사항이 그룹화 키의 작은 부분(대략 5% 미만)을 차지하는지 확인합니다. 그룹화 키에 기본 열이 아닌 복합 식이 포함되어 있는 경우 증분 새로 고침을 위해 대량의 데이터를 검사해야 할 수도 있습니다. 이러한 스캔의 크기를 줄이려면 하나의 동적 테이블에서 식을 구체화한 다음 다른 동적 테이블의 구체화된 열에 그룹화 작업을 적용합니다. 예를 들어, 다음의 복합 문을 살펴보겠습니다. CREATE DYNAMIC TABLE sums
AS
SELECT date_trunc(minute, ts), sum(c1) FROM table
GROUP BY 1;
위의 문은 다음과 같이 최적화될 수 있습니다. CREATE DYNAMIC TABLE intermediate
AS
SELECT date_trunc(minute, ts) ts_min, c1 FROM table;
CREATE DYNAMIC TABLE sums
AS
SELECT ts_min, sum(c1) FROM intermediate
GROUP BY 1;
|
DISTINCT |
집계 함수가 없는 GROUP BY ALL과 동일합니다. |
이는 종종 상당한 최적화 기회를 의미합니다. 실수로 중복이 발생하는 것을 방지하기 위해 쿼리 전체에 DISTINCT를 자유롭게 적용하는 것이 일반적인 관행입니다. 증분 새로 고침에서 DISTINCT 연산자는 새로 고칠 때마다 중복 여부를 확인해야 하므로 반복적으로 리소스를 소모합니다. 성능을 최적화할 때 중복된 DISTINCTs를 찾아 제거하는 것은 쉬울 수 있습니다. 이를 위해 업스트림에서 중복을 제거하고 조인 카디널리티를 신중하게 고려하면 됩니다. |
<fn> OVER <윈도우> |
변경된 모든 파티션 키에 대해 윈도우 함수를 다시 계산하여 증분합니다. |
쿼리에 PARTITION BY 절이 있고 원본 데이터가 파티션 키별로 클러스터링되어 있는지 확인합니다. 또한 변경 사항이 파티션의 작은 부분(대략 5% 미만)을 차지하도록 합니다. |
<왼쪽> INNER JOIN <오른쪽> |
왼쪽의 변경 사항을 오른쪽에 결합한 다음 오른쪽의 변경 사항을 왼쪽에 결합하는 방식으로 증분합니다. |
조인의 한 쪽이 작으면 성능이 우수할 가능성이 높습니다. 조인의 한 쪽이 자주 변경되는 경우 다른 쪽을 조인 키로 클러스터링하면 성능이 향상될 수 있습니다. |
<왼쪽> [{LEFT | RIGHT | FULL }] OUTER JOIN <오른쪽> |
일치하지 않는 경우 NULLs를 계산하기 위해 하나 또는 두 개의 NOT EXISTS로 union-all이 수행된 내부 조인을 팩터링하여 증분합니다. 그런 다음 이 팩터링된 쿼리가 증분됩니다. 내부 조인은 그림과 같이 증분됩니다. 존재하지 않는 키는 한쪽의 변경된 키가 다른 쪽에 이미 존재하는지 확인하여 증분합니다. |
권장 사항:
|
전체 새로 고침에서 지원되는 비결정 함수¶
다음의 비결정적 함수가 동적 테이블에서 지원됩니다. 이러한 함수은 전체 새로 고침에만 지원됩니다. 증분 새로 고침이 지원되지 않는 목록은 증분 새로 고침 지원 제한 사항 을 참조하십시오.
동적 테이블이 다른 동적 테이블에 종속될 때 데이터를 새로 고치는 방법¶
동적 테이블 지연이 시간 척도로 지정된 경우 자동 새로 고침 프로세스에서는 동적 테이블의 목표 지연 시간을 기준으로 새로 고침 일정을 결정합니다. 이 프로세스에서는 테이블의 목표 지연 시간에 가장 적합한 일정을 선택합니다.
참고
목표 지연이 보장되는 것은 아닙니다. 다만, Snowflake가 달성하려는 목표입니다. 동적 테이블의 데이터는 목표 지연 내에서 최대한 가깝게 새로 고쳐집니다. 하지만 웨어하우스 크기, 데이터 크기, 쿼리 복잡성 및 이와 유사한 요인과 같은 요인으로 인해 목표 지연이 초과될 수 있습니다.
한 동적 테이블이 다른 동적 테이블에 종속된 경우에 데이터 일관성을 유지하기 위해, 프로세스에서는 호환 가능한 시간에 계정의 모든 동적 테이블을 새로 고칩니다. 덜 자주 새로 고치는 타이밍이 더 자주 새로 고치는 타이밍과 일치합니다.
예를 들어 동적 테이블 A는 목표 지연 시간이 2분이고 목표 지연 시간이 1분인 동적 테이블 B를 쿼리한다고 가정합니다. 이 프로세스에서는 A를 96초마다, B를 48초마다 새로 고쳐야 한다고 결정할 수 있습니다. 결과적으로, 프로세스에서 다음 일정을 적용할 수 있습니다.
특정 시점 |
새로 고친 동적 테이블 |
---|---|
2022-12-01 00:00:00 |
A, B |
2022-12-01 00:00:48 |
B |
2022-12-01 00:01:36 |
A, B |
2022-12-01 00:02:24 |
B |
이는 주어진 시간에 서로 종속된 일련의 동적 테이블을 쿼리할 때 이들 테이블 전체에서 데이터의 동일한 “스냅샷”을 쿼리하고 있다는 의미입니다.
동적 테이블의 목표 지연 시간은 이 테이블이 종속된 동적 테이블의 목표 지연 시간보다 짧을 수 없습니다. 예를 들어 다음과 같이 가정합니다.
동적 테이블 A는 동적 테이블 B와 C를 쿼리합니다.
동적 테이블 B의 목표 지연 시간은 5분입니다.
동적 테이블 C의 목표 지연 시간은 1분입니다.
이는 A의 목표 지연 시간이 5분보다 짧으면 안 된다는 뜻입니다(즉, B와 C의 지연 시간 중 더 긴 시간보다 짧지 않아야 함).
A에 대한 지연을 5분으로 설정하면 프로세스에서 이러한 다음과 같은 목표로 새로 고침 일정을 설정합니다.
지연 시간이 1분 미만으로 유지하기에 충분할 만큼 자주 C를 새로 고칩니다.
A와 B를 함께, 그리고 지연 시간을 5분 미만으로 유지하기에 충분할 만큼 자주 새로 고칩니다.
스냅샷 격리를 보장하기 위해 A와 B의 새로 고침이 C의 새로 고침과 일치하도록 합니다.
참고: 새로 고침이 너무 오래 걸리면 스케줄러가 최신 상태를 유지하려고 새로 고침을 건너뛸 수도 있습니다. 하지만 스냅샷 격리는 유지됩니다.