Skip to main content
El motor PostgreSQL permite consultas 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.
Consulte nuestro servicio Managed Postgres. Basado en almacenamiento NVMe físicamente colocalizado con el cómputo, ofrece un rendimiento hasta 10 veces mayor para cargas de trabajo limitadas por el disco en comparación con alternativas que usan almacenamiento conectado a la red como EBS, y le permite replicar sus datos de Postgres a ClickHouse mediante el conector Postgres CDC en ClickPipes.

Crear una tabla

Consulte una descripción detallada de la consulta CREATE TABLE. La estructura de la tabla puede diferir de la estructura de la tabla original de PostgreSQL:
  • 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.
Parámetros del motor
  • 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.
Se recomienda usar colecciones con nombre (disponibles desde la versión 21.11) en entornos de producción. Aquí tiene un ejemplo:
Algunos parámetros pueden sobrescribirse mediante argumentos de clave-valor:

Configuración

El grupo de conexiones utilizado por el motor de tabla 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

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 consultas 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

En lugar de un nombre de tabla, el argumento 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:
Esto es útil para hacer pushdown de joins, agregaciones o cualquier otro procesamiento a PostgreSQL. Dicha tabla es de solo lectura: no se permite hacer 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.
Las consultas 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.
Admite varias réplicas que deben listarse mediante |. Por ejemplo:
Se admite la prioridad de las réplicas para el origen de diccionario de PostgreSQL. Cuanto mayor sea el número en el mapa, menor será la prioridad. La prioridad más alta es 0. En el ejemplo siguiente, la réplica example01-1 tiene la prioridad más alta:

Ejemplo de uso

Tabla en PostgreSQL

Crear una tabla en ClickHouse y conectarla con la tabla de PostgreSQL creada anteriormente

Este ejemplo utiliza el motor de tabla PostgreSQL para conectar la tabla de ClickHouse con la tabla de PostgreSQL y usar sentencias SELECT e INSERT en la base de datos PostgreSQL:

Inserción de los datos iniciales desde una tabla de PostgreSQL en una tabla de ClickHouse mediante una consulta SELECT

La función de tabla postgresql copia los datos de PostgreSQL a ClickHouse. Suele utilizarse para mejorar el rendimiento de las consultas al consultar los datos o realizar análisis en ClickHouse en lugar de PostgreSQL, y también puede usarse para migrar datos de PostgreSQL a ClickHouse. Como vamos a copiar los datos de PostgreSQL a ClickHouse, usaremos un motor de tabla MergeTree en ClickHouse y lo llamaremos postgresql_copy:

Insertar datos incrementales desde una tabla de PostgreSQL en una tabla de ClickHouse

Si después va a realizar una sincronización continua entre la tabla de PostgreSQL y la tabla de ClickHouse tras la inserción inicial, puede usar una cláusula WHERE en ClickHouse para insertar solo los datos añadidos a PostgreSQL en función de un timestamp o de un ID de secuencia único. Para ello, debe llevar un registro del ID máximo o del timestamp insertado previamente, como el siguiente:
Luego, insertar los valores de la tabla de PostgreSQL que sean mayores que el máximo

Seleccionar datos de la tabla de ClickHouse resultante

Uso de un esquema distinto del predeterminado

Véase también
Última modificación el 23 de julio de 2026