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, BFILE et les colonnes JSON binaires (OSON) ne sont pas compatibles. Pour interroger une colonne JSON binaire, sérialisez-la en texte dans votre requête (par exemple, avec JSON_SERIALIZE(column_name) ou JSON_QUERY).

  • Les colonnes NUMBER non contraintes et les expressions numériques calculées sont mappées à STRING BigQuery pour préserver une précision totale sans troncature ni dépassement de capacité. Les colonnes NUMBER(p, s) limitées sont mappées sur NUMERIC (lorsque la précision est inférieure ou égale à 38 et que l'échelle est inférieure ou égale à 9) ou BIGNUMERIC (lorsque l'échelle est supérieure à 9 ou que les chiffres entiers sont supérieurs à 29).

  • Les colonnes CHAR(n) et NCHAR(n) de longueur fixe conservent le remplissage des espaces blancs de fin jusqu'à la longueur n lorsqu'elles sont mappées à STRING BigQuery.

  • 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 VARCHAR2 dans l'instruction EXTERNAL_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