Esegui query federate PostgreSQL
In qualità di data analyst, puoi eseguire query sui dati relazionali che risiedono in PostgreSQL direttamente da BigQuery in tempo reale, senza copiare o spostare i dati.
La federazione PostgreSQL di BigQuery utilizza l'API BigQuery Connection per connettersi ai motori di database PostgreSQL.
Puoi quindi utilizzare la funzione EXTERNAL_QUERY per inviare la query SQL direttamente a PostgreSQL per l'esecuzione e i risultati vengono trasmessi direttamente in streaming.
Limitazioni
Le query federate PostgreSQL sono soggette alle seguenti limitazioni:
- Puoi eseguire solo query di sola lettura tramite la funzione
EXTERNAL_QUERY. Le istruzioni DDL (Data Definition Language) e DML (Data Manipulation Language) non sono supportate. - La federazione è accessibile solo tramite la funzione
EXTERNAL_QUERY. La creazione di tabelle esterne o set di dati permanenti di BigQuery che vengono mappati direttamente alle tabelle PostgreSQL non è supportata. - La latenza delle query federate potrebbe essere notevolmente superiore rispetto all'esecuzione della query direttamente in PostgreSQL.
- Il servizio di connessione sottostante potrebbe ibernare le connessioni inattive. La prima query che utilizza una connessione PostgreSQL dopo un periodo di inattività potrebbe richiedere più di un minuto per l'esecuzione durante l'inizializzazione del connettore.
- Il peering DNS non è supportato. Devi connetterti utilizzando un indirizzo IP o un nome host completamente risolvibile all'interno della tua rete VPC.
- La query SQL PostgreSQL deve specificare alias di colonna espliciti per tutte le colonne che contengono risultati o espressioni di funzioni (ad esempio
SELECT COUNT(*) AS total_count). Le espressioni senza alias producono nomi di colonna con caratteri speciali non validi nelle definizioni dello schema della tabella BigQuery. - Quando l'utilizzo dell'API Compute Engine nel progetto di query è limitato dai Controlli di servizio VPC, la query federata non va a buon fine se la connessione utilizza un collegamento di rete. Assicurati che siano configurate regole di traffico in entrata e in uscita dei Controlli di servizio VPC appropriate.
Non sono supportati altri pushdown SQL per PostgreSQL. I filtri e le aggregazioni nella query BigQuery esterna non vengono inseriti nella query interna all'interno della funzione
EXTERNAL_QUERY. Devi specificare i predicati e le proiezioni delle colonne direttamente all'interno dell'istruzione SQL PostgreSQL interna per limitare le righe e le colonne trasferite sulla rete.È supportata solo l'autenticazione con nome utente e password del database PostgreSQL. I provider di identità di terze parti, Kerberos e l'autenticazione IAM del provider cloud non sono supportati.
Le istruzioni
CREATE TABLE ... AS SELECT(CTAS) non vanno a buon fine con erroriUnsupported type INT32oUnsupported type FLOATse la query seleziona colonne di numeri interi a 16 bit (int2,smallint,smallserial) o colonne di numeri in virgola mobile a precisione singola (float4,real). Per salvare i risultati della query in una nuova tabella BigQuery, esegui il cast esplicito delle colonne di numeri interi inINT64e delle colonne di numeri in virgola mobile inFLOAT64nella query: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(...);
L'inserimento in una tabella esistente con
INSERT INTO <table> SELECT ...ha esito positivo senza cast manuali perché BigQuery espande automaticamente i valoriINT32eFLOATin modo che corrispondano alle colonneINT64eFLOAT64della tabella di destinazione.Sia
time [ without time zone ]chetime with time zone(timetz) troncano i valori frazionari dei secondi (microsecondi) in secondi interi. Se è richiesta la precisione al microsecondo, formatta o esegui il cast della colonna intextovarcharnell'istruzioneEXTERNAL_QUERY.Tutte le colonne PostgreSQL
numericedecimalvengono mappate aBIGNUMERIC(76, 38). Le colonne con una scala maggiore di 38 vengono arrotondate a 38 cifre decimali e i valori che superano l'intervalloBIGNUMERIC(più di 38 cifre intere complete) non vanno a buon fine con un errore di valore fuori intervallo. Inoltre, i valori specialiNaN,Infinitye-Infinitynon sono supportati e non funzionano in fase di runtime. Per eseguire query su numeri con parti intere più grandi, precisione frazionaria più elevata o valori speciali, esegui il cast della colonna intextnell'istruzioneEXTERNAL_QUERY.I valori
character(n)/char(n)(bpchar) di lunghezza fissa conservano gli spazi finali fino alla lunghezza n quando vengono mappati aSTRINGdi BigQuery.Le date e i timestamp precedenti al 15 ottobre 1582 sono soggetti a uno spostamento del calendario di 10 giorni a causa della transizione storica al calendario gregoriano. Esegui il cast delle date storiche in
textnell'istruzioneEXTERNAL_QUERYper conservare le date esatte.
Ambienti e versioni PostgreSQL supportati
La federazione delle query supporta i database PostgreSQL nei seguenti ambienti di deployment:
- Database PostgreSQL ospitati nel cloud o on-premise accessibili tramite indirizzi IP pubblici o collegamenti di rete (tramite Cloud VPN o Cloud Interconnect)
- Istanze PostgreSQL self-hosted su Compute Engine o altra infrastruttura
- PostgreSQL 16 (consigliato) e PostgreSQL 15
Prima di iniziare
Assicurati che l'amministratore di BigQuery abbia creato una connessione PostgreSQL e l'abbia condivisa con te.
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per eseguire query su PostgreSQL, chiedi all'amministratore di concederti il ruolo IAM BigQuery Connection User (roles/bigquery.connectionUser) sul progetto.
Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.
Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.
Esegui query sui dati
Per inviare una query federata a PostgreSQL da una query GoogleSQL, utilizza la funzione EXTERNAL_QUERY.
L'esempio seguente è una query federata che unisce i record dei clienti in BigQuery denominati mydataset.customers con gli ordini di vendita transazionali in 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;
Visualizza uno schema di tabella PostgreSQL
Puoi eseguire query sulle tabelle information_schema di PostgreSQL utilizzando EXTERNAL_QUERY per recuperare i metadati del database:
Elenca tutte le tabelle di uno schema
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''');
Visualizza le colonne e i tipi di dati in una tabella
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''');
Mappatura dei tipi di dati
Quando esegui una query federata, BigQuery converte i dati da PostgreSQL in tipi di dati GoogleSQL in base alla tabella seguente:
| Tipo di dati PostgreSQL | Tipo di dati BigQuery |
|---|---|
| Tipi booleani | |
bool, boolean |
BOOL |
| Tipi numerici | |
int2, smallint, smallserial |
INT64 (query interattive; consulta le limitazioni per CREATE TABLE ... AS SELECT) |
int4, integer, serial |
INT64 |
int8, bigint, bigserial |
INT64 |
numeric, decimal |
BIGNUMERIC(76, 38) |
float4, real |
FLOAT64 (query interattive; consulta le limitazioni per CREATE TABLE ... AS SELECT) |
float8, double precision |
FLOAT64 |
| Tipi di dati relativi a data e ora | |
date |
DATE |
timestamp [ without time zone ] |
DATETIME |
timestamp with time zone, timestamptz |
TIMESTAMP |
time [ without time zone ] |
TIME |
time with time zone, timetz |
TIME |
| Tipi di caratteri e testo | |
character(n), char(n), bpchar |
STRING |
character varying(n), varchar(n) |
STRING |
text |
STRING |
Prezzi
Il costo dell'esecuzione di una query federata si basa su tre fattori:
- Il costo di calcolo dell'esecuzione della query in PostgreSQL (addebitato dal provider del database PostgreSQL o dall'ambiente di hosting)
- Il costo della larghezza di banda per il trasferimento dei risultati della query da PostgreSQL a BigQuery (costi di rete in uscita dal provider host del database)
- Il costo di computing per l'esecuzione della query in BigQuery
I costi di computing e traffico in uscita di PostgreSQL vengono fatturati direttamente dal tuo provider PostgreSQL o dall'host dell'infrastruttura, non da Google. Per limitare i costi della larghezza di banda, ti consigliamo di scrivere la query nell'istruzione EXTERNAL_QUERY in modo da escludere tutte le colonne e le righe non necessarie per calcolare il risultato finale.
Non sono previsti costi aggiuntivi per l'esecuzione di query federate in BigQuery. Per saperne di più sui prezzi di BigQuery, consulta Prezzi.
Se la tua connessione utilizza componenti di networking Google Cloud , potrebbero essere applicati anche i seguenti prezzi:
- Prezzi di Virtual Private Cloud
- Prezzi di Cloud VPN
- Prezzi di Cloud NAT
- Prezzi di Cloud Interconnect
Passaggi successivi
- Scopri come connetterti a PostgreSQL.
- Scopri di più sulle query federate.
- Scopri di più sulla gestione delle connessioni.
- Scopri di più sulle query federate di AlloyDB.
- Scopri di più sulle query federate di Cloud SQL.