딕셔너리 레이아웃 유형
딕셔너리를 메모리에 저장하는 방식은 여러 가지가 있으며, 각 방식마다 CPU와 RAM 사용량 사이에 절충이 있습니다.
| 레이아웃 | 설명 |
|---|---|
| flat | 키로 인덱싱된 평면 배열에 데이터를 저장합니다. 가장 빠른 레이아웃이지만 키는 UInt64여야 하며, max_array_size 범위로 제한됩니다. |
| hashed | 데이터를 해시 테이블에 저장합니다. 키 크기 제한이 없고 요소 수에도 제한이 없습니다. |
| sparse_hashed | hashed와 유사하지만, 메모리 사용량을 줄이는 대신 CPU를 더 사용합니다. |
| complex_key_hashed | hashed와 유사하며, 복합 키에 사용합니다. |
| complex_key_sparse_hashed | sparse_hashed와 유사하며, 복합 키에 사용합니다. |
| hashed_array | 해시 테이블로 키를 배열 인덱스에 매핑하고, 속성은 배열에 저장합니다. 속성이 많을 때 메모리 효율이 좋습니다. |
| complex_key_hashed_array | hashed_array와 유사하며, 복합 키에 사용합니다. |
| range_hashed | 정렬된 범위를 사용하는 해시 테이블입니다. 키 + 날짜/시간 범위 기준 조회를 지원합니다. |
| complex_key_range_hashed | range_hashed와 유사하며, 복합 키에 사용합니다. |
| cache | 고정 크기의 인메모리 캐시입니다. 자주 액세스되는 키만 저장합니다. |
| complex_key_cache | cache와 유사하며, 복합 키에 사용합니다. |
| ssd_cache | cache와 유사하지만, 메모리 내 인덱스를 두고 데이터는 SSD에 저장합니다. |
| complex_key_ssd_cache | ssd_cache와 유사하며, 복합 키에 사용합니다. |
| direct | 메모리에 저장하지 않고, 각 요청마다 소스를 직접 쿼리합니다. |
| complex_key_direct | direct와 유사하며, 복합 키에 사용합니다. |
| ip_trie | 빠른 IP 프리픽스 조회(CIDR 기반)를 위한 트라이 구조입니다. |
| hierarchical | 부모-자식 관계를 나타내는 숫자 키를 사용하는 계층 구조를 지원합니다. |
| polygon | 효율적인 point-in-polygon 조회(역지오코딩)를 지원합니다. |
| regexp_tree | 정규식 트리에 대해 키를 매칭합니다. |
딕셔너리 레이아웃 지정
LAYOUT 절(DDL) 또는 설정 파일 정의의 layout 설정을 사용해 딕셔너리 레이아웃을 구성할 수 있습니다.
CREATE DICTIONARY (...)
...
LAYOUT(LAYOUT_TYPE(param value)) -- 레이아웃 설정
...<clickhouse>
<dictionary>
...
<layout>
<layout_type>
<!-- 레이아웃 설정 -->
</layout_type>
</layout>
...
</dictionary>
</clickhouse>전체 DDL 구문은 CREATE DICTIONARY를 참고하십시오.
레이아웃에 complex-key*라는 단어가 없는 딕셔너리는 UInt64 타입의 키를 사용하고, complex-key* 딕셔너리는 복합 키(임의의 타입으로 구성 가능)를 사용합니다.
숫자 키 예시 (key_column 컬럼은 UInt64 타입):
CREATE DICTIONARY dict_name (
key_column UInt64,
...
)
PRIMARY KEY key_column<structure>
<id>
<name>key_column</name>
</id>
...
</structure>복합 키 예시 (키는 String 타입 요소 1개로 구성됨):
CREATE DICTIONARY dict_name (
country_code String,
...
)
PRIMARY KEY country_code<structure>
<key>
<attribute>
<name>country_code</name>
<type>String</type>
</attribute>
</key>
...
</structure>딕셔너리 성능 개선
딕셔너리 성능을 개선하는 방법은 여러 가지가 있습니다.
GROUP BY뒤에서 딕셔너리 작업 함수를 호출합니다.- 추출할 속성을 injective로 표시합니다.
서로 다른 키가 서로 다른 속성 값에 대응할 때 해당 속성을 injective라고 합니다.
따라서
GROUP BY에서 키로 속성 값을 가져오는 함수를 사용하면, 이 함수는 자동으로GROUP BY밖으로 분리됩니다.
ClickHouse는 딕셔너리 관련 오류가 발생하면 예외를 생성합니다. 오류 예시는 다음과 같습니다.
- 접근하는 딕셔너리를 로드할 수 없습니다.
cached딕셔너리를 쿼리하는 중 오류가 발생했습니다.
system.dictionaries 테이블에서 딕셔너리 목록과 상태를 확인할 수 있습니다.