Tipos de layout del diccionario
Hay varias formas de almacenar diccionarios en memoria, cada una con sus propias compensaciones entre el uso de CPU y RAM.
| Layout | Descripción |
|---|---|
| flat | Almacena los datos en arrays planos indexados por clave. Es el layout más rápido, pero las claves deben ser UInt64 y estar limitadas por max_array_size. |
| hashed | Almacena los datos en una tabla hash. No hay límite en el tamaño de las claves y admite cualquier número de elementos. |
| sparse_hashed | Como hashed, pero reduce el uso de memoria a cambio de más CPU. |
| complex_key_hashed | Como hashed, para claves compuestas. |
| complex_key_sparse_hashed | Como sparse_hashed, para claves compuestas. |
| hashed_array | Atributos almacenados en arrays con una tabla hash que asigna las claves a índices del array. Eficiente en memoria cuando hay muchos atributos. |
| complex_key_hashed_array | Como hashed_array, para claves compuestas. |
| range_hashed | Tabla hash con rangos ordenados. Admite búsquedas por clave + rango de fecha/hora. |
| complex_key_range_hashed | Como range_hashed, para claves compuestas. |
| cache | Caché en memoria de tamaño fijo. Solo se almacenan las claves a las que se accede con frecuencia. |
| complex_key_cache | Como cache, para claves compuestas. |
| ssd_cache | Como cache, pero almacena los datos en SSD con un índice en memoria. |
| complex_key_ssd_cache | Como ssd_cache, para claves compuestas. |
| direct | Sin almacenamiento en memoria: consulta el origen directamente para cada solicitud. |
| complex_key_direct | Como direct, para claves compuestas. |
| ip_trie | Estructura trie para búsquedas rápidas de prefijos IP (basadas en CIDR). |
| hierarchical | Compatibilidad con jerarquías con una clave numérica que describe relaciones padre-hijo. |
| polygon | Búsquedas eficientes de punto en polígono (geocodificación inversa). |
| regexp_tree | Compara las claves con un árbol de expresiones regulares. |
Especificar el layout del diccionario
Puede configurar el layout de un diccionario con la cláusula LAYOUT (para DDL) o con el ajuste layout en las definiciones del archivo de configuración.
CREATE DICTIONARY (...)
...
LAYOUT(LAYOUT_TYPE(param value)) -- configuración del layout
...<clickhouse>
<dictionary>
...
<layout>
<layout_type>
<!-- configuración del layout -->
</layout_type>
</layout>
...
</dictionary>
</clickhouse>Véase también CREATE DICTIONARY para consultar la sintaxis DDL completa.
Los diccionarios cuyo layout no contiene la palabra complex-key* tienen una clave de tipo UInt64; los diccionarios complex-key* tienen una clave compuesta (compleja, con tipos arbitrarios).
Ejemplo de clave numérica (la columna key_column es de tipo UInt64):
CREATE DICTIONARY dict_name (
key_column UInt64,
...
)
PRIMARY KEY key_column<structure>
<id>
<name>key_column</name>
</id>
...
</structure>Ejemplo de clave compuesta (la clave tiene un elemento de tipo String):
CREATE DICTIONARY dict_name (
country_code String,
...
)
PRIMARY KEY country_code<structure>
<key>
<attribute>
<name>country_code</name>
<type>String</type>
</attribute>
</key>
...
</structure>Mejorar el rendimiento de los diccionarios
Hay varias formas de mejorar el rendimiento de los diccionarios:
- Llame a la función para trabajar con el diccionario después de
GROUP BY. - Marque como inyectivos los atributos que se van a extraer.
Un atributo se considera inyectivo si a claves distintas les corresponden valores de atributo distintos.
Por lo tanto, cuando
GROUP BYusa una función que obtiene un valor de atributo a partir de la clave, esta función se saca automáticamente deGROUP BY.
ClickHouse genera una excepción cuando se producen errores en los diccionarios. Algunos ejemplos de errores son:
- No se pudo cargar el diccionario al que se intenta acceder.
- Error al consultar un diccionario
cached.
Puede ver la lista de diccionarios y sus estados en la tabla system.dictionaries.