Exécuter des requêtes fédérées Oracle
En tant qu'analyste de données, vous pouvez interroger des données relationnelles résidant dans Oracle directement depuis BigQuery en temps réel, sans copier ni déplacer de données.
La fédération BigQuery Oracle utilise l'API BigQuery Connection pour se connecter aux moteurs de base de données Oracle. Vous pouvez ensuite utiliser la fonction EXTERNAL_QUERY pour envoyer votre requête SQL directement à Oracle pour exécution, et les résultats sont renvoyés directement.
Limites
Les requêtes fédérées Oracle 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 correspondent directement à des tables Oracle 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 Oracle.
- Le service de connexion sous-jacent peut mettre en veille les connexions inactives. La première requête qui utilise une connexion Oracle 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 Oracle 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 Oracle. 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 Oracle 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 Oracle est acceptée. Les fournisseurs d'identité tiers, Kerberos, RADIUS et l'authentification IAM Oracle Cloud Infrastructure (OCI) ne sont pas acceptés.
Les types Oracle complexes ou propriétaires tels que les types définis par l'utilisateur (UDT), les types spatiaux (
SDO_GEOMETRY), les types de collection (VARRAY, tables imbriquées),SYS.ANYDATA,REF,BFILEet les colonnesJSONbinaires (OSON) ne sont pas compatibles. Pour interroger une colonneJSONbinaire, sérialisez-la en texte dans votre requête (par exemple, avecJSON_SERIALIZE(column_name)ouJSON_QUERY).Les colonnes
NUMBERnon contraintes et les expressions numériques calculées sont mappées àSTRINGBigQuery pour préserver une précision totale sans troncature ni dépassement de capacité. Les colonnesNUMBER(p, s)limitées sont mappées surNUMERIC(lorsque la précision est inférieure ou égale à 38 et que l'échelle est inférieure ou égale à 9) ouBIGNUMERIC(lorsque l'échelle est supérieure à 9 ou que les chiffres entiers sont supérieurs à 29).Les colonnes
CHAR(n)etNCHAR(n)de longueur fixe conservent le remplissage des espaces blancs de fin jusqu'à la longueur n lorsqu'elles sont mappées àSTRINGBigQuery.Les dates et les codes temporels antérieurs au 15 octobre 1582 peuvent subir un décalage de 10 jours dans le calendrier en raison de la transition historique vers le calendrier grégorien. Pour conserver les dates historiques exactes antérieures à 1582, castez-les en
VARCHAR2dans l'instructionEXTERNAL_QUERY.
Environnements et versions d'Oracle compatibles
La fédération de requêtes est compatible avec les bases de données Oracle dans les environnements de déploiement suivants :
- Oracle Database@Google Cloud
- Oracle Exadata Database Service
- Instances Oracle sur site connectées à Google Cloud via Cloud VPN, Cloud Interconnect ou une adresse IP publique sur Internet
La fédération de requêtes est compatible avec les versions d'Oracle suivantes :
- Oracle Database 23.x (23ai)
- Oracle Database 21.x
- Oracle Database 19.x (19c)
Avant de commencer
Assurez-vous que votre administrateur BigQuery a créé une connexion Oracle et l'a partagée avec vous.
Rôles requis
Pour obtenir les autorisations nécessaires pour interroger Oracle, 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 à Oracle à 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 enregistrements de commande en temps réel d'une base de données Oracle :
SELECT bq_cust.customer_id, bq_cust.customer_name, oracle_orders.order_id, oracle_orders.order_status, oracle_orders.order_total FROM mydataset.customers AS bq_cust JOIN EXTERNAL_QUERY( 'projects/my-project/locations/us-central1/connections/oracle_prod_conn', '''SELECT customer_id, order_id, order_status, order_total FROM orders WHERE order_date >= SYSDATE - 1''') AS oracle_orders ON bq_cust.customer_id = oracle_orders.customer_id;
Afficher un schéma de table Oracle
Vous pouvez interroger les vues du dictionnaire de données Oracle via EXTERNAL_QUERY pour inspecter les métadonnées de la base de données, découvrir des tables et examiner les schémas de colonnes avant d'exécuter des analyses.
Lister toutes les tables accessibles
SELECT * FROM EXTERNAL_QUERY( 'projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID', '''SELECT owner, table_name, tablespace_name, status FROM all_tables ORDER BY owner, 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, data_length, data_precision, data_scale, nullable FROM all_tab_columns WHERE owner = 'SCHEMA_NAME' AND table_name = 'TABLE_NAME' ORDER BY column_id''');
Mappage des types de données
Lorsque vous exécutez une requête fédérée, BigQuery convertit les données d'Oracle en types de données GoogleSQL, conformément au tableau suivant :
| Type de donnée Oracle | Type de données BigQuery |
|---|---|
| Types numériques | |
NUMBER(p, s) (p ≤ 38, s ≤ 9) |
NUMERIC |
NUMBER(p, s) (s > 9 ou p > 38) |
BIGNUMERIC |
NUMBER (échelle non contrainte ou flottante) |
STRING |
FLOAT, FLOAT(p) |
FLOAT64 |
BINARY_FLOAT |
FLOAT64 |
BINARY_DOUBLE |
FLOAT64 |
| Types de caractères et de chaînes | |
CHAR(n) |
STRING |
NCHAR(n) |
STRING |
VARCHAR2(n) |
STRING |
NVARCHAR2(n) |
STRING |
CLOB |
STRING |
NCLOB |
STRING |
LONG |
STRING |
| Types binaires | |
RAW(n) |
BYTES |
BLOB |
BYTES |
LONG RAW |
BYTES |
| Types de date, d'heure et d'intervalle | |
DATE |
DATETIME |
TIMESTAMP, TIMESTAMP(p) |
DATETIME |
TIMESTAMP WITH TIME ZONE |
TIMESTAMP |
TIMESTAMP WITH LOCAL TIME ZONE |
TIMESTAMP |
INTERVAL YEAR TO MONTH |
STRING |
INTERVAL DAY TO SECOND |
STRING |
| Types d'identification des lignes | |
ROWID |
STRING |
UROWID |
STRING |
| Types semi-structurés, vectoriels et XML | |
JSON (textuel/OSON avec sérialisation de texte) |
STRING |
VECTOR |
STRING |
XMLTYPE |
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 Oracle (facturé par votre fournisseur de base de données Oracle ou votre environnement d'hébergement)
- Le coût de la bande passante pour le transfert des résultats de la requête d'Oracle 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 liés à Oracle dépendent du type de service Oracle et de l'environnement d'hébergement que vous utilisez. 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 à Oracle.
- Apprenez-en plus sur les requêtes fédérées.
- Découvrez comment gérer les connexions.