Executar consultas federadas do PostgreSQL
Como analista de dados, é possível consultar dados relacionais que residem no PostgreSQL diretamente do BigQuery em tempo real, sem copiar ou mover dados.
A federação do BigQuery PostgreSQL usa a
API BigQuery Connection para se conectar a mecanismos de banco de dados PostgreSQL.
Em seguida, use a
função EXTERNAL_QUERY
para enviar a consulta SQL diretamente ao PostgreSQL para execução, e
os resultados serão transmitidos diretamente de volta.
Limitações
As consultas federadas do PostgreSQL estão sujeitas às seguintes limitações:
- Só é possível executar consultas somente leitura usando a função
EXTERNAL_QUERY. As instruções de linguagem de definição de dados (DDL) e de linguagem de manipulação de dados (DML) não são compatíveis. - A federação só pode ser acessada pela função
EXTERNAL_QUERY. Não é possível criar tabelas externas do BigQuery ou conjuntos de dados permanentes que sejam mapeados diretamente para tabelas do PostgreSQL. - A latência da consulta federada pode ser visivelmente maior do que a execução da consulta diretamente no PostgreSQL.
- O serviço de conexão subjacente pode hibernar conexões inativas. A primeira consulta que usa uma conexão do PostgreSQL após um período de inatividade pode levar mais de um minuto para ser executada enquanto o conector é inicializado.
- O peering de DNS não é compatível. É preciso se conectar usando um endereço IP ou um nome de host totalmente resolvível na rede VPC.
- A consulta SQL do PostgreSQL precisa especificar aliases de coluna explícitos para todas as colunas que contêm resultados ou expressões de função (por exemplo,
SELECT COUNT(*) AS total_count). Expressões sem alias produzem nomes de coluna com caracteres especiais que são inválidos nas definições de esquema de tabela do BigQuery. - Quando o uso da API Compute Engine no projeto de consulta é restrito pelo VPC Service Controls, a consulta federada falha se a conexão usa um anexo de rede. Verifique se as regras de entrada e saída apropriadas do VPC Service Controls estão configuradas.
Não há suporte para pushdowns SQL adicionais no PostgreSQL. Os filtros e as agregações na consulta externa do BigQuery não são enviados para a consulta interna na função
EXTERNAL_QUERY. É preciso especificar predicados e projeções de coluna diretamente na instrução SQL interna do PostgreSQL para limitar as linhas e colunas transferidas pela rede.Somente a autenticação de nome de usuário e senha do banco de dados PostgreSQL é aceita. Não há suporte para provedores de identidade de terceiros, Kerberos e autenticação do IAM do provedor de nuvem.
As instruções
CREATE TABLE ... AS SELECT(CTAS) falham com errosUnsupported type INT32ouUnsupported type FLOATse a consulta selecionar colunas de números inteiros de 16 bits (int2,smallint,smallserial) ou colunas flutuantes de precisão única (float4,real). Para salvar os resultados da consulta em uma nova tabela do BigQuery, converta explicitamente as colunas de números inteiros emINT64e as colunas flutuantes emFLOAT64na consulta:CREATE TABLE mydataset.mytable AS SELECT CAST(small_col AS INT64) AS small_col, CAST(real_col AS FLOAT64) AS real_col, ... FROM EXTERNAL_QUERY(...);
A inserção em uma tabela com
INSERT INTO <table> SELECT ...é bem-sucedida sem transmissões manuais porque o BigQuery amplia automaticamente os valoresINT32eFLOATpara corresponder às colunasINT64eFLOAT64da tabela de destino.Tanto
time [ without time zone ]quantotime with time zone(timetz) truncam valores fracionários de subsegundos (microssegundos) para segundos inteiros. Se a precisão de microssegundos for necessária, formate ou converta a coluna emtextouvarcharna instruçãoEXTERNAL_QUERY.Todas as colunas
numericedecimaldo PostgreSQL são mapeadas paraBIGNUMERIC(76, 38). As colunas com escala maior que 38 são arredondadas para 38 casas decimais, e os valores que excedem o intervaloBIGNUMERIC(mais de 38 dígitos inteiros completos) falham com um erro de fora do intervalo. Além disso, os valores especiaisNaN,Infinitye-Infinitynão são compatíveis e falham no ambiente de execução. Para consultar números com partes inteiras maiores, maior precisão fracionária ou valores especiais, converta a coluna emtextna instruçãoEXTERNAL_QUERY.Os valores
character(n)/char(n)(bpchar) de comprimento fixo preservam os espaços à direita até o comprimento n quando mapeados para oSTRINGdo BigQuery.As datas e os carimbos de data/hora anteriores a 15 de outubro de 1582 estão sujeitos a uma mudança de 10 dias no calendário devido à transição histórica do calendário gregoriano. Converta datas históricas em
textna instruçãoEXTERNAL_QUERYpara preservar as datas exatas.
Ambientes e versões compatíveis do PostgreSQL
A federação de consultas é compatível com bancos de dados PostgreSQL nos seguintes ambientes de implantação:
- Bancos de dados PostgreSQL hospedados na nuvem ou no local acessíveis por endereços IP públicos ou anexos de rede (pelo Cloud VPN ou Cloud Interconnect)
- Instâncias do PostgreSQL auto-hospedadas no Compute Engine ou em outra infraestrutura
- PostgreSQL 16 (recomendado) e PostgreSQL 15
Antes de começar
Verifique se o administrador do BigQuery criou uma conexão do PostgreSQL e compartilhou com você.
Funções exigidas
Para receber as permissões necessárias para consultar o PostgreSQL, peça ao administrador para conceder a você o papel do IAM de Usuário de conexão do BigQuery (roles/bigquery.connectionUser) no projeto.
Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.
Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de outros papéis predefinidos.
Consultar dados
Para enviar uma consulta federada ao PostgreSQL de uma consulta do GoogleSQL, use a função EXTERNAL_QUERY.
O exemplo a seguir é uma consulta federada que mescla registros de clientes no BigQuery chamados mydataset.customers com pedidos de vendas transacionais no PostgreSQL:
SELECT c.customer_id, c.name, fo.first_order_date FROM mydataset.customers AS c LEFT OUTER JOIN EXTERNAL_QUERY( 'projects/my-project/locations/us-central1/connections/postgres_prod_conn', '''SELECT customer_id, MIN(order_date) AS first_order_date FROM orders GROUP BY customer_id''') AS fo ON fo.customer_id = c.customer_id GROUP BY c.customer_id, c.name, fo.first_order_date;
Visualizar um esquema de tabela do PostgreSQL
É possível consultar as tabelas information_schema do PostgreSQL usando
EXTERNAL_QUERY para recuperar metadados do banco de dados:
Listar todas as tabelas em um esquema
SELECT * FROM EXTERNAL_QUERY( 'projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID', '''SELECT table_schema, table_name, table_type FROM information_schema.tables WHERE table_schema = 'SCHEMA_NAME' ORDER BY table_name''');
Ver colunas e tipos de dados em uma tabela
SELECT * FROM EXTERNAL_QUERY( 'projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID', '''SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_schema = 'SCHEMA_NAME' AND table_name = 'TABLE_NAME' ORDER BY ordinal_position''');
Mapeamento de tipo de dados
Quando você executa uma consulta federada, o BigQuery converte os dados do PostgreSQL em tipos de dados do GoogleSQL de acordo com a seguinte tabela:
| Tipo de dados do PostgreSQL | Tipo de dados do BigQuery |
|---|---|
| Tipos booleanos | |
bool, boolean |
BOOL |
| Tipos numéricos | |
int2, smallint, smallserial |
INT64 (consultas interativas; consulte Limitações para CREATE TABLE ... AS SELECT) |
int4, integer, serial |
INT64 |
int8, bigint, bigserial |
INT64 |
numeric, decimal |
BIGNUMERIC(76, 38) |
float4, real |
FLOAT64 (consultas interativas; consulte Limitações para CREATE TABLE ... AS SELECT) |
float8, double precision |
FLOAT64 |
| Tipos de data e hora | |
date |
DATE |
timestamp [ without time zone ] |
DATETIME |
timestamp with time zone, timestamptz |
TIMESTAMP |
time [ without time zone ] |
TIME |
time with time zone, timetz |
TIME |
| Tipos de caracteres e texto | |
character(n), char(n), bpchar |
STRING |
character varying(n), varchar(n) |
STRING |
text |
STRING |
Preços
O custo de executar uma consulta federada é baseado em três fatores:
- O custo de computação da execução da consulta no PostgreSQL (cobrado pelo provedor de banco de dados ou ambiente de hospedagem do PostgreSQL)
- O custo da largura de banda da transferência dos resultados da consulta do PostgreSQL para o BigQuery (cobranças de rede de saída do provedor de hospedagem do banco de dados)
- O custo de computação da execução da consulta no BigQuery.
Todos os custos de computação e saída do PostgreSQL são faturados diretamente pelo
provedor do PostgreSQL ou pelo host da infraestrutura, não pelo Google. Para
limitar o custo da largura de banda, recomendamos que você grave a consulta na
instrução EXTERNAL_QUERY para que exclua todas as colunas e linhas que não sejam
necessárias para calcular o resultado final.
Não há custo adicional para executar consultas federadas no BigQuery. Para mais informações sobre os preços do BigQuery, consulte Preços.
Se a conexão usar componentes de rede do Google Cloud , os seguintes preços também poderão ser aplicados:
- Preços da nuvem privada virtual
- Preços do Cloud VPN
- Preços do Cloud NAT
- Preços do Cloud Interconnect
A seguir
- Saiba como se conectar ao PostgreSQL.
- Saiba mais sobre consultas federadas.
- Saiba mais sobre como gerenciar conexões.
- Saiba mais sobre as consultas federadas do AlloyDB.
- Saiba mais sobre as consultas federadas do Cloud SQL.