SELECT e INSERT em dados armazenados em um servidor PostgreSQL remoto.
Atualmente, apenas as versões 12 ou superiores do PostgreSQL são compatíveis com o motor de tabela.
Criando uma tabela
- Os nomes das colunas devem ser os mesmos da tabela PostgreSQL original, mas você pode usar apenas algumas delas e em qualquer ordem.
- Os tipos das colunas podem ser diferentes dos da tabela PostgreSQL original. O ClickHouse tenta converter os valores para os tipos de dados do ClickHouse.
- A configuração external_table_functions_use_nulls define como tratar colunas Nullable. Valor padrão: 1. Se for 0, a função de tabela não cria colunas Nullable e insere valores padrão em vez de valores nulos. Isso também se aplica a valores NULL dentro de arrays.
host:port— Endereço do servidor PostgreSQL.database— Nome do banco de dados remoto.table— Nome da tabela remota ou uma consulta passada ao PostgreSQL como está (veja Passando uma consulta em vez de um nome de tabela).user— Usuário do PostgreSQL.password— Senha do usuário.schema— Esquema de tabela não padrão. Opcional.on_conflict— Estratégia de resolução de conflitos. Exemplo:ON CONFLICT DO NOTHING. Opcional. Observação: adicionar esta opção tornará a inserção menos eficiente.
Configurações
PostgreSQL (e pela função de tabela postgresql) pode ser configurado para cada tabela com uma cláusula SETTINGS. Quando uma configuração não é especificada, o valor padrão é o da configuração postgresql_* correspondente no nível da consulta.
postgresql_connection_pool_size
16.
postgresql_connection_pool_wait_timeout
0 significa que a operação bloqueia quando o pool está vazio.
Valor padrão: 5000.
postgresql_connection_pool_retries
2.
postgresql_connection_pool_auto_close_connection
false.
postgresql_connection_attempt_timeout
connect_timeout na URL de conexão.
Valor padrão: 2.
Exemplo:
Detalhes de implementação
SELECT no PostgreSQL são executadas como COPY (SELECT ...) TO STDOUT dentro de uma transação PostgreSQL somente leitura, com commit após cada consulta SELECT.
Cláusulas WHERE simples, como =, !=, >, >=, <, <= e IN, são executadas no servidor PostgreSQL.
Todas as junções, agregações, ordenações, condições IN [ array ] e a restrição de amostragem LIMIT são executadas no ClickHouse somente após a conclusão da consulta ao PostgreSQL.
Passando uma consulta em vez de um nome de tabela
table pode ser uma consulta SELECT passada ao PostgreSQL como está. A estrutura da tabela é inferida a partir do resultado da consulta. A consulta pode ser escrita como uma subconsulta ou encapsulada na função query:
INSERT nela não é permitido. A mesma sintaxe também é compatível com a função de tabela postgresql.
A forma de subconsulta
(SELECT ...) é analisada pelo ClickHouse e reserializada no dialeto PostgreSQL (aspas de identificadores do PostgreSQL e escapamento de literais de string) antes de ser enviada ao servidor. Portanto, ela deve ser um ClickHouse SQL válido. Para passar sintaxe específica do PostgreSQL que o ClickHouse não analisa, use a forma query('...'), cujo texto é enviado ao PostgreSQL literalmente.Qualquer WHERE, LIMIT, agregação etc. externo da consulta ClickHouse circundante não é delegado à consulta passada — ele é aplicado no ClickHouse após a obtenção do resultado completo da consulta. Para restringir os dados lidos do PostgreSQL, coloque o filtro dentro da consulta passada. Com external_table_strict_query = 1, um filtro externo que não pode ser delegado é rejeitado com uma exceção em vez de ser aplicado localmente.INSERT no PostgreSQL são executadas como COPY "table_name" (field1, field2, ... fieldN) FROM STDIN dentro de uma transação PostgreSQL, com commit automático após cada instrução INSERT.
Os tipos Array do PostgreSQL são convertidos em arrays do ClickHouse.
Atenção: no PostgreSQL, um dado de array, criado como
type_name[], pode conter arrays multidimensionais com números diferentes de dimensões em diferentes linhas da mesma coluna da tabela. Já no ClickHouse, só é permitido ter arrays multidimensionais com a mesma quantidade de dimensões em todas as linhas da mesma coluna da tabela.|. Por exemplo:
0.
No exemplo abaixo, a réplica example01-1 tem a maior prioridade: