join_algorithm
- La inferencia de tipos de las join keys se vuelve más estricta (un merge join no puede combinar claves de tipos diferentes, por ejemplo,
StringyNullable(String)). Esto puede cambiar los tipos de resultado de las columnasUSINGy puede hacer que un join en una tabla con motorJoinfalle conTYPE_MISMATCH. Se activa confull_sorting_mergeyparallel_full_sorting_merge. ORDER BY ... LIMITen el lado preservado de un join obtiene una ordenación explícita en lugar de una lectura en orden de clave primaria, porque se supone que el join interrumpe la lectura ordenada (un merge join inserta su propia ordenación previa al join; un partial merge join vuelve a ordenar los bloques izquierdos; un join que puede producir bloques retrasados tampoco propaga la lectura ordenada). El resultado es el mismo, pero el plan es menos eficiente. Se activa confull_sorting_merge,parallel_full_sorting_merge,partial_merge,prefer_partial_merge,grace_hashyauto, y también con un valor distinto de cero demax_bytes_before_external_join/max_bytes_ratio_before_external_join.
hash u otro algoritmo. Si esto no es deseable, no incluya los algoritmos anteriores en join_algorithm para las consultas afectadas.
Valores posibles:
- grace_hash
grace_hash_join_initial_buckets). Esto se hace de forma que cada bucket pueda procesarse de manera independiente. Las filas del primer bucket se añaden a una hash table en memoria, mientras que las demás se guardan en disco. Si la hash table supera el memory limit (por ejemplo, el configurado en max_bytes_in_join), se incrementa el número de buckets y se reasigna el bucket correspondiente a cada fila. Las filas que no pertenezcan al bucket actual se descargan y se reasignan.
Admite INNER/LEFT/RIGHT/FULL ALL/ANY JOIN.
- hash
OR en la sección JOIN ON.
Cuando se usa el algoritmo hash, la parte derecha de JOIN se carga en RAM.
- parallel_hash
hash join que divide los datos en buckets y construye varias hash tables de forma simultánea, en lugar de una sola, para acelerar este proceso.
Cuando se usa el algoritmo parallel_hash, la parte derecha de JOIN se carga en RAM.
- partial_merge
RIGHT JOIN y FULL JOIN solo se admiten con estrictez ALL (SEMI, ANTI, ANY y ASOF no son compatibles).
Cuando se usa el algoritmo partial_merge, ClickHouse ordena los datos y los vuelca a disco. El algoritmo partial_merge en ClickHouse difiere ligeramente de la implementación clásica. Primero, ClickHouse ordena la tabla derecha por join keys en bloques y crea un índice min-max para los bloques ordenados. Después, ordena partes de la tabla izquierda por la join key y las combina con la tabla derecha. El índice min-max también se utiliza para omitir bloques innecesarios de la tabla derecha.
- direct
direct (también conocido como nested loop) realiza una lookup en la tabla derecha usando como claves las filas de la tabla izquierda.
Es compatible con almacenamientos especiales como Dictionary, EmbeddedRocksDB y tablas MergeTree.
Para las tablas MergeTree, el algoritmo envía los filtros de join key directamente a la storage layer. Esto puede ser más eficiente cuando la clave puede usar el primary key index de la tabla para lookups; de lo contrario, realiza escaneos completos de la tabla derecha para cada block de la tabla izquierda.
Admite joins INNER y LEFT, y solo join keys de igualdad de una sola columna sin otras condiciones.
- auto
auto, primero se prueba hash join y el algoritmo cambia dinámicamente a otro algoritmo si se supera el memory limit.
- full_sorting_merge
- ie_join
JOIN cuya sección ON tiene dos comparaciones de desigualdad (<, <=, >, >=) entre expresiones de las tablas combinadas. Admite ALL INNER/LEFT/RIGHT/FULL JOIN y SEMI/ANTI LEFT/RIGHT JOIN.
La posición en la lista establece la prioridad: si aparece después de otros algoritmos, IEJoin se usa solo cuando estos no se aplican (la sección ON no tiene condiciones de igualdad); si aparece primero, se usa siempre que la sección ON tenga dos condiciones de desigualdad. Las condiciones restantes (incluidas las igualdades) se aplican como filtro sobre el resultado del join para ALL INNER JOIN, y se evalúan dentro del operador como una condición residual que afecta a la coincidencia para los demás tipos. Sin ie_join en la lista, un INNER JOIN con solo condiciones de desigualdad se ejecuta como un CROSS JOIN con un filtro, y los demás tipos no son compatibles.
Ambas entradas se acumulan en memoria antes de realizar el join: max_rows_in_join y max_bytes_in_join limitan conjuntamente la entrada acumulada de ambos lados (no solo del lado derecho), con la acción ante overflow establecida mediante join_overflow_mode; los índices de ordenación que el operador construye sobre la entrada acumulada no cuentan para el límite. El propio operador join se ejecuta en un único thread; solo se paralelizan las ordenaciones de las entradas previas al join.
- parallel_full_sorting_merge
full_sorting_merge, pero los joins de igualdad compatibles con hash se segmentan por el hash de las join keys en merge joins independientes por segmento que se ejecutan en paralelo (hasta max_threads), en lugar de un único merge join. Esto mantiene el bajo uso de memoria en streaming de un merge join mientras usa todos los threads, y el resultado no está ordenado.
La segmentación por hash mediante las join keys se aplica solo a joins de igualdad simples en tipos de clave cuyo hash coincide con la comparación del merge join, y solo cuando ninguno de los lados ya está ordenado. Se omite en estos casos:
- Joins
ASOFy tipos de clave de coma flotante /JSON/Object/Dynamic: sus hashes no son coherentes con la comparación del merge join, por lo que claves iguales podrían terminar en segmentos diferentes. - Lados que ya están ordenados (una lectura de MergeTree en orden o cualquier entrada preordenada): una dispersión que preserve el orden en los merges por segmento puede bloquear la canalización. En su lugar se conservan la lectura en orden y su optimización
read_in_order_use_virtual_row. - Mientras el iniciador crea un plan distribuido (
make_distributed_plan), porque la ordenación dispersa no se puede serializar para la ejecución remota. El plan local de un solo fragmento y los fragmentos por trabajador se vuelven a optimizar con esa configuración desactivada, por lo que aún pueden segmentarse.
full_sorting_merge, y los lados de MergeTree que se leen en orden aún pueden segmentarse en el origen mediante rangos de primary key (que se ordenan según la misma comparación que usa el join, por lo que las claves iguales permanecen juntas) cuando query_plan_join_shard_by_pk_ranges está habilitado.
- prefer_partial_merge
partial_merge join si es posible; en caso contrario, usa hash. Obsoleto, igual que partial_merge,hash.
- default (obsoleto)
direct,hash; es decir, intenta usar direct join y hash join (en este orden).
join_any_take_last_row
ANY cuando la tabla derecha tiene más de una fila coincidente para una clave.
Esta configuración se aplica a las tablas con motor
Join y a los algoritmos de join basados en hash.Si un join se construye en paralelo, el orden de las filas puede no ser determinista. Esto significa que join_any_take_last_row = 1 puede devolver una fila no determinista en las consultas ANY JOIN.- 0 — Si la tabla derecha tiene más de una fila coincidente, solo se une la primera fila encontrada.
- 1 — Si la tabla derecha tiene más de una fila coincidente, solo se une la última fila encontrada.
join_default_strictness
ALL— Si la tabla de la derecha tiene varias filas coincidentes, ClickHouse crea un producto cartesiano a partir de las filas coincidentes. Este es el comportamiento normal deJOINen standard SQL.ANY— Si la tabla de la derecha tiene varias filas coincidentes, solo se combina la primera que se encuentra. Si la tabla de la derecha tiene solo una fila coincidente, los resultados deANYyALLson los mismos.ASOF— Para combinar secuencias con una coincidencia incierta.Cadena vacía— Si no se especificaALLoANYen la consulta, ClickHouse lanza una excepción.
join_on_disk_max_files_to_merge
- Cualquier entero positivo a partir de 2.
join_output_by_rowlist_perkey_rows_threshold
join_overflow_mode
hash, parallel_hash e ie_join de
join_algorithm. Otros
algoritmos (por ejemplo, partial_merge, grace_hash, auto) gestionan los
límites de forma diferente: mediante volcado a disco, reparticionamiento o cambio de
estrategia; consulte
join_algorithm.
Valores posibles:
THROW— ClickHouse lanza una excepción y detiene la consulta.BREAK— ClickHouse detiene la consulta y no lanza ninguna excepción.
THROW.
Véase también