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.
TLS/SSL
Los parámetros de TLS/SSL se reenvían alibpq y pueden establecerse como claves de una colección con nombre o como argumentos de clave-valor finales: sslmode (disable, allow, prefer, require, verify-ca o verify-full), así como los certificados y la clave, en una de dos formas. Si no se establecen, se aplican los valores predeterminados de libpq (sslmode=prefer).
sslrootcert(certificado de CA o el valor especialsystem),sslcert(certificado de cliente) ysslkey(clave privada de cliente) son rutas a archivos locales del servidor. Solo pueden especificarse en una colección con nombre definida en el archivo de configuración del servidor y no pueden sobrescribirse en una consulta: el servidor abre los archivos con sus propios privilegios.sslrootcert_pem,sslcert_pemysslkey_pemaceptan el contenido literal del archivo correspondiente en lugar de una ruta. Pueden especificarse en cualquier lugar —en una consulta, en una colección con nombre creada con SQL o como sobrescritura de una colección con nombre— y se ocultan en los logs y las consultasSHOW, como las contraseñas.
Configuración
El grupo de conexiones utilizado por el motor de tablaPostgreSQL (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
Tamaño del grupo de conexiones (si todas las conexiones están en uso, la consulta espera hasta que se libere alguna). Debe ser distinto de cero.
Valor predeterminado: 16.
postgresql_connection_pool_wait_timeout
Tiempo de espera de push/pop del grupo de conexiones, en milisegundos, cuando el grupo está vacío. 0 significa que se bloquea si el grupo está vacío.
Valor predeterminado: 5000.
postgresql_connection_pool_retries
Número de reintentos al extraer o devolver conexiones del grupo de conexiones.
Valor predeterminado: 2.
postgresql_connection_pool_auto_close_connection
Cierra la conexión antes de devolverla al grupo.
Valor predeterminado: false.
postgresql_connection_attempt_timeout
Tiempo de espera de la conexión, en segundos, para un único intento de conexión al endpoint de PostgreSQL. El valor se pasa como parámetro connect_timeout de la URL de conexión.
Valor predeterminado: 2.
Ejemplo:
Detalles de implementación
Las consultasSELECT 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
En lugar de un nombre de tabla, el argumentotable 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 hace pushdown 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 sobre las columnas de la tabla se rechaza con una excepción en lugar de aplicarse localmente, porque no puede hacer pushdown a la consulta pasada. La comprobación abarca el predicado WHERE de nivel superior y cada conjunción de un AND de nivel superior. Un PREWHERE sobre las columnas de esta tabla no es un caso para esta configuración: este motor de tabla no admite PREWHERE, y una consulta de ese tipo se rechaza con ILLEGAL_PREWHERE independientemente de la configuración. La comprobación solo se ejecuta allí donde realmente sería posible hacer pushdown de un filtro: cuando esta tabla es la única tabla de la consulta, en cualquiera de los lados de un INNER JOIN, o en el lado preservado de un outer join (el lado izquierdo de un LEFT JOIN, el lado derecho de un RIGHT JOIN). En el lado no preservado de un LEFT/RIGHT JOIN y en cualquiera de los lados de un FULL JOIN no se hace pushdown de nada ni se comprueba nada, por lo que un filtro sobre las columnas de esta tabla se aplica localmente después del join incluso en modo estricto. Donde sí se ejecuta la comprobación, un predicado que hace referencia a otras tablas unidas en la consulta que la rodea no hace pushdown y queda excluido de la comprobación, tanto si hace referencia únicamente al lado unido como si lo mezcla con esta tabla dentro de una única expresión que no sea AND (por ejemplo, un OR); dicho predicado conserva su punto de evaluación habitual en ClickHouse (WHERE después del join, PREWHERE antes de él) y no se rechaza.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: