Exécuter des requêtes fédérées PostgreSQL
En tant qu'analyste de données, vous pouvez interroger des données relationnelles résidant dans PostgreSQL directement depuis BigQuery en temps réel, sans copier ni déplacer de données.
La fédération BigQuery PostgreSQL utilise l'API BigQuery Connection pour se connecter aux moteurs de base de données PostgreSQL.
Vous pouvez ensuite utiliser la fonction EXTERNAL_QUERY pour envoyer votre requête SQL directement à PostgreSQL pour exécution, et les résultats sont renvoyés directement en flux continu.
Limites
Les requêtes fédérées PostgreSQL sont soumises aux limites suivantes :
- Vous ne pouvez exécuter que des requêtes en lecture seule via la fonction
EXTERNAL_QUERY. Les instructions LDD (langage de définition de données) et LMD (langage de manipulation de données) ne sont pas compatibles. - La fédération n'est accessible que via la fonction
EXTERNAL_QUERY. La création de tables externes BigQuery ou d'ensembles de données permanents qui mappent directement des tables PostgreSQL n'est pas possible. - La latence des requêtes fédérées peut être nettement plus élevée que celle de l'exécution de la requête directement dans PostgreSQL.
- Le service de connexion sous-jacent peut mettre en veille les connexions inactives. La première requête qui utilise une connexion PostgreSQL après une période d'inactivité peut prendre plus d'une minute, le temps que le connecteur s'initialise.
- L'appairage DNS n'est pas pris en charge. Vous devez vous connecter à l'aide d'une adresse IP ou d'un nom d'hôte entièrement résolvable dans votre réseau VPC.
- La requête SQL PostgreSQL doit spécifier des alias de colonne explicites pour toutes les colonnes contenant des résultats de fonction ou des expressions (par exemple,
SELECT COUNT(*) AS total_count). Les expressions sans alias produisent des noms de colonne avec des caractères spéciaux qui ne sont pas valides dans les définitions de schéma de table BigQuery. - Lorsque l'utilisation de l'API Compute Engine dans le projet de requête est limitée par VPC Service Controls, la requête fédérée échoue si la connexion utilise un rattachement de réseau. Assurez-vous que les règles d'entrée et de sortie VPC Service Controls appropriées sont configurées.
Aucun pushdown SQL supplémentaire n'est compatible avec PostgreSQL. Les filtres et les agrégations de la requête BigQuery externe ne sont pas transmis à la requête interne dans la fonction
EXTERNAL_QUERY. Vous devez spécifier des prédicats et des projections de colonnes directement dans l'instruction SQL PostgreSQL interne pour limiter les lignes et les colonnes transférées sur le réseau.Seule l'authentification par nom d'utilisateur et mot de passe de la base de données PostgreSQL est acceptée. Les fournisseurs d'identité tiers, Kerberos et l'authentification IAM du fournisseur de services cloud ne sont pas acceptés.
Les instructions
CREATE TABLE ... AS SELECT(CTAS) échouent avec des erreursUnsupported type INT32ouUnsupported type FLOATsi la requête sélectionne des colonnes d'entiers 16 bits (int2,smallint,smallserial) ou des colonnes de nombres à virgule flottante simple précision (float4,real). Pour enregistrer les résultats de la requête dans une nouvelle table BigQuery, castez explicitement les colonnes d'entiers enINT64et les colonnes de nombres à virgule flottante enFLOAT64dans votre requête :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'insertion dans une table existante avec
INSERT INTO <table> SELECT ...réussit sans casts manuels, car BigQuery élargit automatiquement les valeursINT32etFLOATpour qu'elles correspondent aux colonnesINT64etFLOAT64de la table cible.time [ without time zone ]ettime with time zone(timetz) tronquent les valeurs fractionnaires inférieures à la seconde (microseconde) en secondes entières. Si une précision à la microseconde est requise, formatez ou castez la colonne entextouvarchardans l'instructionEXTERNAL_QUERY.Toutes les colonnes PostgreSQL
numericetdecimalsont mappées surBIGNUMERIC(76, 38). Les colonnes dont l'échelle est supérieure à 38 sont arrondies à 38 décimales, et les valeurs qui dépassent la plageBIGNUMERIC(plus de 38 chiffres entiers) échouent avec une erreur de dépassement de plage. De plus, les valeurs spécialesNaN,Infinityet-Infinityne sont pas acceptées et échouent au moment de l'exécution. Pour interroger des nombres avec des parties entières plus grandes, une précision fractionnaire plus élevée ou des valeurs spéciales, castez la colonne entextdans l'instructionEXTERNAL_QUERY.Les valeurs
character(n)/char(n)(bpchar) de longueur fixe conservent les espaces de fin jusqu'à la longueur n lorsqu'elles sont mappées àSTRINGBigQuery.Les dates et les codes temporels antérieurs au 15 octobre 1582 sont soumis à un décalage de 10 jours dans le calendrier en raison de la transition historique vers le calendrier grégorien. Convertissez les dates historiques en
textdans l'instructionEXTERNAL_QUERYpour conserver les dates exactes.
Environnements et versions PostgreSQL compatibles
La fédération de requêtes est compatible avec les bases de données PostgreSQL dans les environnements de déploiement suivants :
- Bases de données PostgreSQL hébergées dans le cloud ou sur site, accessibles via des adresses IP publiques ou des rattachements de réseau (via Cloud VPN ou Cloud Interconnect)
- Instances PostgreSQL auto-hébergées sur Compute Engine ou une autre infrastructure
- PostgreSQL 16 (recommandé) et PostgreSQL 15
Avant de commencer
Assurez-vous que votre administrateur BigQuery a créé une connexion PostgreSQL et l'a partagée avec vous.
Rôles requis
Pour obtenir les autorisations nécessaires pour interroger PostgreSQL, demandez à votre administrateur de vous accorder le rôle IAM Utilisateur de connexion BigQuery (roles/bigquery.connectionUser) sur le projet.
Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.
Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.
Interroger les données
Pour envoyer une requête fédérée à PostgreSQL à partir d'une requête GoogleSQL, utilisez la fonction EXTERNAL_QUERY.
L'exemple suivant est une requête fédérée qui joint les enregistrements client dans BigQuery nommés mydataset.customers aux commandes transactionnelles dans 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;
Afficher un schéma de table PostgreSQL
Vous pouvez interroger les tables PostgreSQL information_schema à l'aide de EXTERNAL_QUERY pour récupérer les métadonnées de la base de données :
Lister toutes les tables d'un schéma
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''');
Afficher les colonnes et les types de données d'une table
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''');
Mappage des types de données
Lorsque vous exécutez une requête fédérée, BigQuery convertit les données de PostgreSQL en types de données GoogleSQL, comme indiqué dans le tableau suivant :
| Type de données PostgreSQL | Type de données BigQuery |
|---|---|
| Types booléens | |
bool, boolean |
BOOL |
| Types numériques | |
int2, smallint, smallserial |
INT64 (requêtes interactives ; consultez la section Limites pour CREATE TABLE ... AS SELECT) |
int4, integer, serial |
INT64 |
int8, bigint, bigserial |
INT64 |
numeric, decimal |
BIGNUMERIC(76, 38) |
float4, real |
FLOAT64 (requêtes interactives ; consultez la section Limites pour CREATE TABLE ... AS SELECT) |
float8, double precision |
FLOAT64 |
| Types de date et d'heure | |
date |
DATE |
timestamp [ without time zone ] |
DATETIME |
timestamp with time zone, timestamptz |
TIMESTAMP |
time [ without time zone ] |
TIME |
time with time zone, timetz |
TIME |
| Types de caractères et de texte | |
character(n), char(n), bpchar |
STRING |
character varying(n), varchar(n) |
STRING |
text |
STRING |
Tarifs
Le coût d'exécution d'une requête fédérée dépend de trois facteurs :
- Le coût de calcul lié à l'exécution de la requête dans PostgreSQL (facturé par votre fournisseur de base de données PostgreSQL ou votre environnement d'hébergement)
- Le coût de la bande passante pour le transfert des résultats de la requête de PostgreSQL vers BigQuery (frais de réseau de sortie de votre fournisseur d'hébergement de base de données)
- Le coût de calcul lié à l'exécution de la requête dans BigQuery.
Les coûts de calcul et de sortie PostgreSQL sont facturés directement par votre fournisseur PostgreSQL ou votre hébergeur d'infrastructure, et non par Google. Pour limiter les coûts en termes de bande passante, nous vous recommandons d'écrire la requête dans l'instruction EXTERNAL_QUERY afin d'exclure toutes les colonnes et les lignes qui ne sont pas nécessaires au calcul du résultat final.
L'exécution de requêtes fédérées dans BigQuery n'entraîne aucuns frais supplémentaires. Pour en savoir plus sur les tarifs de BigQuery, consultez la section Tarifs.
Si votre connexion utilise des composants réseau Google Cloud , les tarifs suivants peuvent également s'appliquer :
Étapes suivantes
- Découvrez comment vous connecter à PostgreSQL.
- Apprenez-en plus sur les requêtes fédérées.
- Découvrez comment gérer les connexions.
- En savoir plus sur les requêtes fédérées AlloyDB.
- Découvrez les requêtes fédérées Cloud SQL.