CREATE DICTIONARY ... LIFETIME

CREATE DICTIONARY ... LIFETIME

ClickHouse는 LIFETIME 태그(초 단위로 정의)에 따라 딕셔너리를 주기적으로 업데이트해요. LIFETIME는 완전히 다운로드되는 딕셔너리의 업데이트 간격이며, 캐시형 딕셔너리의 무효화 간격이에요.

출처: 문서

본문

ClickHouse는 LIFETIME 태그(초 단위로 정의)에 따라 딕셔너리를 주기적으로 업데이트해요. LIFETIME는 완전히 다운로드되는 딕셔너리의 업데이트 간격이며, 캐시형 딕셔너리의 무효화 간격이에요.

업데이트 중에도 딕셔너리의 이전 버전을 계속 쿼리할 수 있어요. 딕셔너리 업데이트는 첫 사용을 위해 로드할 때를 제외하면 쿼리를 차단하지 않아요. 업데이트 중 오류가 발생하면 오류가 서버 로그에 기록되고, 쿼리는 이전 버전의 딕셔너리를 계속 사용할 수 있습니다. 딕셔너리 업데이트가 성공하면 이전 버전의 딕셔너리가 원자적으로 교체됩니다.

설정 예시:

ClickHouse Cloud에서 딕셔너리를 사용한다면 DDL 쿼리 방식으로 딕셔너리를 만들고, default 사용자로 딕셔너리를 생성하세요. 또한 지원되는 딕셔너리 소스 목록은 Cloud Compatibility guide에서 확인하세요.

<dictionary>
    ...
    <lifetime>300</lifetime>
    ...
</dictionary>

또는

CREATE DICTIONARY (...)
...
LIFETIME(300)
...

<lifetime>0</lifetime>(LIFETIME(0))을 설정하면 딕셔너리가 업데이트되지 않아요.

업데이트를 위한 시간 간격을 설정할 수 있고, ClickHouse는 이 범위 내에서 균일하게 임의의 시간을 선택해요. 이는 많은 수의 서버에서 업데이트할 때 딕셔너리 소스에 대한 부하를 분산하기 위해 필요합니다.

설정 예시:

<dictionary>
    ...
    <lifetime>
        <min>300</min>
        <max>360</max>
    </lifetime>
    ...
</dictionary>

또는

LIFETIME(MIN 300 MAX 360)

<min>0</min>이고 <max>0</max>이면 ClickHouse는 타임아웃으로 딕셔너리를 다시 로드하지 않아요. 이 경우, 딕셔너리 구성 파일이 변경되거나 SYSTEM RELOAD DICTIONARY 명령이 실행되면 ClickHouse가 딕셔너리를 더 일찍 다시 로드할 수 있어요.

딕셔너리를 업데이트할 때 ClickHouse 서버는 source의 타입에 따라 다른 로직을 적용해요.

  • 텍스트 파일의 경우 수정 시간을 확인한다. 시간이 이전에 기록된 시간과 다르면 딕셔너리가 업데이트돼요.
  • 다른 소스의 딕셔너리는 기본적으로 매번 업데이트돼요.

다른 소스(ODBC, PostgreSQL, ClickHouse 등)의 경우, 매번이 아니라 딕셔너리가 실제로 변경된 경우에만 업데이트하는 쿼리를 설정할 수 있어요. 이렇게 하려면 다음 단계를 따르세요.

  • 딕셔너리 테이블은 소스 데이터가 업데이트될 때 항상 변경되는 필드를 가져야 해요.
  • 소스 설정은 변하는 필드를 검색하는 쿼리를 지정해야 해요. ClickHouse 서버는 쿼리 결과를 행으로 해석하며, 이 행이 이전 상태와 비교해 변경되었으면 딕셔너리가 업데이트됩니다. source 설정에서 <invalidate_query> 필드에 쿼리를 지정하세요.

설정 예시:

<dictionary>
    ...
    <odbc>
      ...
      <invalidate_query>SELECT update_time FROM dictionary_source where id = 1</invalidate_query>
    </odbc>
    ...
</dictionary>

또는

...
SOURCE(ODBC(... invalidate_query 'SELECT update_time FROM dictionary_source where id = 1'))
...

Cache, ComplexKeyCache, SSDCache, SSDComplexKeyCache 딕셔너리의 경우 동기 및 비동기 업데이트가 모두 지원돼요.

Flat, Hashed, HashedArray, ComplexKeyHashed 딕셔너리가 이전 업데이트 이후 변경된 데이터만 요청하는 것도 가능해요. 딕셔너리 소스 구성의 일부로 update_field가 지정되면, 데이터 요청에 이전 업데이트 시간(초) 값이 추가됩니다. 소스 타입(Executable, HTTP, MySQL, PostgreSQL, ClickHouse 또는 ODBC)에 따라 외부 소스에서 데이터를 요청하기 전에 update_field에 다른 로직이 적용돼요.

  • 소스가 HTTP이면 update_field가 쿼리 파라미터로 추가되고 마지막 업데이트 시간이 파라미터 값이 돼요.
  • 소스가 Executable이면 update_field가 실행 스크립트 인자로 추가되고 마지막 업데이트 시간이 인자 값이 돼요.
  • 소스가 ClickHouse, MySQL, PostgreSQL, ODBC이면 WHERE의 추가 부분이 생기는데, update_field가 마지막 업데이트 시간보다 크거나 같은지 비교되요.

기본적으로 이 WHERE 조건은 SQL 쿼리의 최상위 레벨에서 확인됩니다. 또는 {condition} 키워드를 사용해 쿼리 내의 다른 WHERE 절에서도 조건을 확인할 수 있어요. 예:

...
SOURCE(CLICKHOUSE(...
    update_field 'added_time'
    QUERY '
        SELECT my_arr.1 AS x, my_arr.2 AS y, creation_time
        FROM (
            SELECT arrayZip(x_arr, y_arr) AS my_arr, creation_time
            FROM dictionary_source
            WHERE {condition}
        )'
))
...

update_field 옵션이 설정되면 추가 옵션 update_lag도 설정할 수 있어요. update_lag 옵션의 값은 업데이트된 데이터를 요청하기 전에 이전 업데이트 시간에서 빼집니다.

설정 예시:

<dictionary>
    ...
        <clickhouse>
            ...
            <update_field>added_time</update_field>
            <update_lag>15</update_lag>
        </clickhouse>
    ...
</dictionary>

또는

...
SOURCE(CLICKHOUSE(... update_field 'added_time' update_lag 15))
...

더 알아보기 (Learn more)