동적 테이블에서 불변성 제약 조건 사용하기¶
*불변성 제약 조건*을 사용하면 동적 테이블이 업데이트되는 방식과 시기를 더 잘 제어할 수 있습니다. 이 제약 조건을 사용하면 전체 테이블이 항상 최신 쿼리 결과를 반영하는 대신 테이블의 일부를 정적으로 유지할 수 있습니다.
동적 테이블의 특정 부분을 변경 불가능으로 표시하여 다음 작업을 수행할 수 있습니다.
기존 데이터에 대한 업데이트 또는 삭제 전파를 방지합니다.
조건을 충족하는 행에 대한 삽입, 업데이트, 삭제를 제한합니다.
테이블의 다른 부분에 대한 증분 업데이트를 계속 활성화하면서 향후 수정을 제한합니다.
불변성 제약 조건이 있는 동적 테이블을 백필합니다. 자세한 내용은 백필을 사용하여 동적 테이블 만들기 섹션을 참조하십시오.
테이블의 나머지 부분(즉, 불변성 조건과 일치하지 않는 행)은 변경 가능한 상태로 유지되며 새로 고침 중에 업데이트할 수 있습니다.
불변성 제약 조건을 적용하려면 CREATE DYNAMIC TABLE 또는 ALTER DYNAMIC TABLE 명령을 실행할 때 IMMUTABLE WHERE 매개 변수를 지정합니다. IMMUTABLE WHERE 조건에서 참조되는 열은 기본 테이블의 열이 아니라 동적 테이블의 열이어야 합니다. 예를 들어, 다음 SQL 문의 IMMUTABLE WHERE 식은 :code:`id`가 아닌 :code:`id1`만 사용할 수 있습니다.
CREATE DYNAMIC TABLE my_dynamic_table (id1 INT)
TARGET_LAG = '20 minutes'
WAREHOUSE = mywh
IMMUTABLE WHERE ( <expr> )
AS
SELECT id AS id1 FROM staging_table;
행이 변경 가능한지 여부를 확인하려면 METADATA$IS_IMMUTABLE 열을 사용합니다. 예: SELECT * , METADATA$IS_IMMUTABLE FROM my_dynamic_table.
동적 테이블의 불변성 제약 조건을 확인하려면 SHOW DYNAMIC TABLES 명령을 실행합니다. immutable_where 열은 테이블에 설정된 IMMUTABLE WHERE 제약 조건을 표시하거나 아무것도 설정되지 않은 경우 NULL을 표시합니다.
컴퓨팅 비용에 대한 자세한 내용은 불변성 제약 조건에 대한 비용 계산 섹션을 참조하세요.
예: IMMUTABLE WHERE를 사용하여 차원 테이블이 변경되는 경우 이전 데이터 재계산 방지¶
다음 예에서는 차원 테이블의 행을 업데이트하면 이전의 모든 팩트 대신 해당 행과 조인된 마지막 날의 팩트가 다시 처리됩니다.
CREATE DYNAMIC TABLE joined_data
TARGET_LAG = '1 minute'
WAREHOUSE = mywh
IMMUTABLE WHERE (timestamp_col < CURRENT_TIMESTAMP() - INTERVAL '1 day')
AS
SELECT F.primary_key primary_key, F.timestamp_col timestamp_col, D.value dim_value
FROM fact_table F
LEFT OUTER JOIN dimension_table D USING (primary_key);
예: 무제한 보존 동적 테이블 및 제한된 보존 기본 테이블¶
다음 예제에서는 최근에 추가된 데이터의 윈도우가 제한된 스테이징 테이블 및 구문 분석되고 필터링된 모든 데이터를 저장하는 동적 테이블을 만듭니다.
CREATE TABLE staging_data (raw TEXT, ts TIMESTAMP);
CREATE DYNAMIC TABLE parsed_data
TARGET_LAG = '1 minute'
WAREHOUSE = mywh
IMMUTABLE WHERE (ts < CURRENT_TIMESTAMP() - INTERVAL '7 days')
AS
SELECT parse_json(raw):event_id::string event_id, parse_json(raw):name::string name, parse_json(raw):region::string region, ts
FROM staging_data WHERE region = 'US';
-- Delete old staging data using Task
CREATE TASK delete_old_staging_data
WAREHOUSE = mywh
SCHEDULE = '24 hours'
AS
DELETE FROM staging_data WHERE ts < CURRENT_TIMESTAMP() - INTERVAL '30 days';
예: IMMUTABLE WHERE를 사용하여 업스트림 동적 테이블이 전체 새로 고침 모드에서 실행될 때 증분 다운스트림 새로 고침 활성화¶
Python 사용자 정의 테이블 함수(UDTFs)와 같은 일부 쿼리 구성을 전체 새로 고침 모드에서 실행하려면 동적 테이블이 필요합니다. 일반적으로 이 제한으로 인해 증분 처리가 방지됩니다. 다운스트림 테이블을 증분 상태로 유지하려면 다음 예제와 같이 IMMUTABLE WHERE 절을 사용하여 변경 불가능한 리전을 정의할 수 있습니다. 이를 통해 업스트림 테이블에 전체 새로 고침이 필요한 경우에도 다운스트림 테이블이 성능 최적화의 이점을 계속 누릴 수 있습니다.
CREATE FUNCTION my_udtf(x varchar)
RETURNS TABLE (output VARCHAR)
LANGUAGE PYTHON
AS $$ ... $$;
CREATE DYNAMIC TABLE udtf_dt
TARGET_LAG = '1 hour'
WAREHOUSE = mywh
REFRESH_MODE = FULL
IMMUTABLE WHERE (ts < current_timestamp() - interval '1 day')
AS
SELECT ts, data, output, join_key FROM input_table, TABLE(my_udtf(data));
CREATE DYNAMIC TABLE incremental_join_dt
TARGET_LAG = '1 hour'
WAREHOUSE = mywh
REFRESH_MODE = INCREMENTAL
IMMUTABLE WHERE (ts < current_timestamp() - interval '1 day')
AS
SELECT * FROM udtf_dt JOIN dim_table USING (join_key);
불변성 제약 조건 설정 시 제한 사항 및 고려 사항¶
The IMMUTABLE WHERE predicate is ignored during the initial refresh but applies to all subsequent refreshes. In full refresh mode, the predicate limits recomputation to only the rows that don’t match the condition.
스트림 및 증분 새로 고침 동적 테이블은 불변성 제약 조건이 있는 전체 새로 고침 동적 테이블에서 읽을 수 있습니다.
IMMUTABLE WHERE 제약 조건은 복제 시 제한 없이 복사됩니다.
모든 :doc:`일반 동적 테이블의 제한 사항</user-guide/dynamic-tables-limitations>`은 계속 적용됩니다. 또한 다음 제한 사항이 적용됩니다.
동적 테이블에는 단일 IMMUTABLE WHERE 조건자만 있을 수 있습니다. ALTER DYNAMIC TABLE … SET IMMUTABLE WHERE 명령으로 다른 조건자를 설정하면 기존 조건자가 대체됩니다.
IMMUTABLE WHERE 제약 조건에는 다음 항목을 포함할 수 없습니다.
하위 쿼리.
CURRENT_TIMESTAMP() 또는 CURRENT_DATE()와 같은 타임스탬프 함수를 제외한 비결정적 함수. 타임스탬프 함수를 사용하는 경우 변경할 수 없는 리전이 시간이 지남에 따라 축소되지 않도록 이러한 함수를 사용해야 합니다. 예를 들어, :code:`TIMESTAMP_COL < CURRENT_TIMESTAMP()는 허용되지만 CURRENT_TIMESTAMP()`는 허용되지 않습니다.
사용자 정의 함수 또는 외부 함수.
메타데이터 열(예: :code:`METADATA$`로 시작하는 열).
집계, 윈도우 함수 또는 비결정적 함수의 결과로 생성된 열 또는 윈도우 함수 연산자를 통해 전달되는 열. 다음 동적 테이블에서는 IMMUTABLE WHERE 조건자에 :code:`col3`만 사용할 수 있습니다.
CREATE DYNAMIC TABLE aggregates TARGET_LAG = '1 minute' WAREHOUSE = mywh AS SELECT col3, SUM(col2) AS col2 FROM input_table GROUP BY col3; CREATE DYNAMIC TABLE window_fns TARGET_LAG = '1 minute' WAREHOUSE = mywh AS SELECT col3, SUM(col4) OVER (PARTITION BY col3 ORDER BY col4) AS col2, col5 FROM input_table;
동적 테이블에는 단일 IMMUTABLE WHERE 조건만 설정할 수 있습니다. 기존 조건자를 바꾸려면 다음 예제에서와 같이 ALTER DYNAMIC TABLE 명령을 사용합니다.
-- Set or replace an existing predicate: ALTER DYNAMIC TABLE my_dynamic_table SET IMMUTABLE WHERE ( <expr> );
-- Remove an existing predicate: ALTER DYNAMIC TABLE my_dynamic_table UNSET IMMUTABLE WHERE;