메인 콘텐츠로 건너뛰기
ClickHouse는 LIFETIME 태그(초 단위로 정의됨)를 기준으로 주기적으로 딕셔너리를 업데이트합니다. LIFETIME은 전체를 다운로드한 딕셔너리의 업데이트 인터벌이며, 캐시된 딕셔너리의 무효화 인터벌입니다. 업데이트 중에도 이전 버전의 딕셔너리는 계속 쿼리할 수 있습니다. 처음 사용할 때 로드되는 경우를 제외하면 딕셔너리 업데이트가 쿼리를 차단하지는 않습니다. 업데이트 중 오류가 발생하면 해당 오류가 서버 로그에 기록되며, 쿼리는 계속 이전 버전의 딕셔너리를 사용할 수 있습니다. 딕셔너리 업데이트가 성공하면 이전 버전의 딕셔너리는 원자적으로 대체됩니다. 설정 예시:
ClickHouse Cloud에서 딕셔리를 사용하는 경우, 딕셔너리를 만들 때는 DDL query 옵션을 사용하고 사용자 default로 생성하십시오. 또한 Cloud Compatibility 가이드에서 지원되는 딕셔너리 소스 목록도 확인하십시오.
<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는 timeout으로 딕셔너리를 다시 로드하지 않습니다. 이 경우 딕셔너리 설정 파일이 변경되었거나 SYSTEM RELOAD DICTIONARY 명령이 실행되면 ClickHouse가 딕셔너리를 더 일찍 다시 로드할 수 있습니다. 딕셔너리를 업데이트할 때 ClickHouse 서버는 소스의 유형에 따라 서로 다른 로직을 적용합니다.
  • 텍스트 파일의 경우 수정 시간을 확인합니다. 이 시간이 이전에 기록된 시간과 다르면 딕셔너리가 업데이트됩니다.
  • 다른 소스의 딕셔너리는 기본적으로 매번 업데이트됩니다.
다른 소스(ODBC, PostgreSQL, ClickHouse 등)의 경우 매번이 아니라 실제로 변경되었을 때만 딕셔너리를 업데이트하도록 쿼리를 구성할 수 있습니다. 이렇게 하려면 다음 단계를 따르십시오.
  • 딕셔너리 테이블에는 원본 데이터가 업데이트될 때마다 항상 변경되는 필드가 있어야 합니다.
  • 소스 설정에는 변경되는 필드를 조회하는 쿼리를 지정해야 합니다. ClickHouse 서버는 쿼리 결과를 하나의 행으로 해석하고, 이 행이 이전 상태와 비교해 변경된 경우 딕셔너리를 업데이트합니다. 쿼리는 소스 설정의 <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가 마지막 업데이트 시간을 값으로 하는 쿼리 매개변수로 추가됩니다.
  • 소스가 실행형이면 update_field가 마지막 업데이트 시간을 값으로 하는 실행형 스크립트 인수로 추가됩니다.
  • 소스가 ClickHouse, MySQL, PostgreSQL, ODBC이면 추가 WHERE 조건이 적용되며, 여기서 update_field는 마지막 업데이트 시간보다 크거나 같은 값으로 비교됩니다.
    • 기본적으로 이 WHERE 조건은 SQL 쿼리의 최상위 수준에서 검사됩니다. 또는 쿼리 내 다른 WHERE 절에서 {condition} 키워드를 사용해 이 조건을 검사할 수도 있습니다. 예시:
      ...
      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))
...
마지막 수정일 2026년 6월 10일