SELECT y INSERT sobre datos almacenados en un servidor PostgreSQL remoto.
Actualmente, este motor de tabla solo es compatible con PostgreSQL 12 y versiones posteriores.
Crear una tabla
- Los nombres de las columnas deben ser los mismos que en la tabla original de PostgreSQL, pero puede usar solo algunas de ellas y en cualquier orden.
- Los tipos de las columnas pueden diferir de los de la tabla original de PostgreSQL. ClickHouse intenta convertir los valores a los tipos de datos de ClickHouse.
- La configuración external_table_functions_use_nulls define cómo manejar las columnas Nullable. Valor predeterminado: 1. Si es 0, la función de tabla no crea columnas Nullable e inserta valores predeterminados en lugar de valores nulos. Esto también se aplica a los valores NULL dentro de arrays.
host:port— Dirección del servidor PostgreSQL.database— Nombre de la base de datos remota.table— Nombre de la tabla remota, o una consulta pasada a PostgreSQL tal cual (consulte Pasar una consulta en lugar de un nombre de tabla).user— Usuario de PostgreSQL.password— Contraseña del usuario.schema— Esquema de tabla distinto del predeterminado. Opcional.on_conflict— Estrategia de resolución de conflictos. Ejemplo:ON CONFLICT DO NOTHING. Opcional. Nota: añadir esta opción hará que la inserción sea menos eficiente.
Configuración
PostgreSQL (y la función de tabla postgresql) puede configurarse para cada tabla mediante una cláusula SETTINGS. Cuando no se especifica ninguna configuración, se usa de forma predeterminada el valor de la configuración postgresql_* correspondiente a nivel de consulta.
postgresql_connection_pool_size
16.
postgresql_connection_pool_wait_timeout
0 significa que se bloquea si el grupo está vacío.
Valor predeterminado: 5000.
postgresql_connection_pool_retries
2.
postgresql_connection_pool_auto_close_connection
false.
postgresql_connection_attempt_timeout
connect_timeout de la URL de conexión.
Valor predeterminado: 2.
Ejemplo:
Detalles de implementación
SELECT del lado de PostgreSQL se ejecutan como COPY (SELECT ...) TO STDOUT dentro de una transacción de PostgreSQL de solo lectura, con commit después de cada consulta SELECT.
Las cláusulas WHERE simples, como =, !=, >, >=, <, <= e IN, se ejecutan en el servidor PostgreSQL.
Todos los joins, las agregaciones, la ordenación, las condiciones IN [ array ] y la restricción de muestreo LIMIT se ejecutan en ClickHouse solo después de que finaliza la consulta a PostgreSQL.
Pasar una consulta en lugar de un nombre de tabla
table puede ser una consulta SELECT que se pasa a PostgreSQL tal como está. La estructura de la tabla se infiere a partir del resultado de la consulta. La consulta puede escribirse como una subconsulta o envolverse en la función query:
INSERT en ella. La misma sintaxis es compatible con la función de tabla postgresql.
La forma de subconsulta
(SELECT ...) es analizada por ClickHouse y se vuelve a serializar en el dialecto de PostgreSQL (entrecomillado de identificadores de PostgreSQL y escape de literales de cadena) antes de enviarse al servidor. Por lo tanto, debe ser válida en ClickHouse SQL. Para pasar sintaxis específica de PostgreSQL que ClickHouse no analiza, use la forma query('...'), cuyo texto se envía literalmente a PostgreSQL.Cualquier WHERE, LIMIT, agregación, etc. externo de la consulta de ClickHouse que la rodea no se delega a la consulta pasada; se aplica en ClickHouse después de recuperar el resultado completo de la consulta. Para restringir los datos leídos desde PostgreSQL, coloque el filtro dentro de la consulta pasada. Con external_table_strict_query = 1, un filtro externo que no pueda delegarse se rechaza con una excepción en lugar de aplicarse localmente.INSERT del lado de PostgreSQL se ejecutan como COPY \"table_name\" (field1, field2, ... fieldN) FROM STDIN dentro de una transacción de PostgreSQL con auto-commit después de cada sentencia INSERT.
Los tipos Array de PostgreSQL se convierten en arrays de ClickHouse.
Tenga cuidado: en PostgreSQL, un dato de tipo array, creado como
type_name[], puede contener arrays multidimensionales con distintas dimensiones en diferentes filas de la misma columna de la tabla. Pero en ClickHouse solo se permite tener arrays multidimensionales con la misma cantidad de dimensiones en todas las filas de una misma columna.|. Por ejemplo:
0.
En el ejemplo siguiente, la réplica example01-1 tiene la prioridad más alta: