Oracle 連携クエリを実行する

データ アナリストは、データのコピーや移動を行うことなく、Oracle に存在するリレーショナル データを BigQuery から直接リアルタイムでクエリできます。

BigQuery Oracle 連携では、BigQuery Connection API を使用して Oracle データベース エンジンに接続します。EXTERNAL_QUERY 関数を使用して SQL クエリを Oracle に直接送信して実行すると、結果が直接ストリーミングされます。

制限事項

Oracle 連携クエリには、次の制限があります。

  • EXTERNAL_QUERY 関数を使用して実行できるのは、読み取り専用クエリのみです。データ定義言語(DDL)ステートメントとデータ操作言語(DML)ステートメントはサポートされていません。
  • 連携には EXTERNAL_QUERY 関数を介してのみアクセスできます。Oracle テーブルに直接マッピングされる BigQuery 外部テーブルまたは永続データセットの作成はサポートされていません。
  • 連携クエリのレイテンシは、Oracle で直接クエリを実行する場合よりも大幅に長くなる可能性があります。
  • 基盤となる接続サービスが、非アクティブな接続を休止状態にする可能性があります。非アクティブな期間の後に Oracle 接続を使用する最初のクエリは、コネクタの初期化中に実行に 1 分以上かかることがあります。
  • DNS ピアリングはサポートされていません。VPC ネットワーク内の IP アドレスまたは完全に解決可能なホスト名を使用して接続する必要があります。
  • Oracle SQL クエリでは、関数の結果または式を含む列(SELECT COUNT(*) AS total_count など)に明示的な列エイリアスを指定する必要があります。エイリアスが設定されていない式では、BigQuery テーブル スキーマ定義で無効な特殊文字を含む列名が生成されます。
  • クエリ プロジェクトでの Compute Engine API の使用が VPC Service Controls によって制限されている場合、接続でネットワーク アタッチメントが使用されていると、連携クエリは失敗します。適切な VPC Service Controls の上り(内向き)ルールと下り(外向き)ルールが構成されていることを確認します。
  • Oracle では、追加の SQL プッシュダウンはサポートされていません。外部の BigQuery クエリのフィルタと集計は、EXTERNAL_QUERY 関数内の内部クエリにプッシュダウンされません。ネットワーク経由で転送される行と列を制限するには、内部の Oracle SQL ステートメント内で述語と列のプロジェクションを直接指定する必要があります。

  • Oracle データベースのユーザー名とパスワードによる認証のみがサポートされています。サードパーティの ID プロバイダ、Kerberos、RADIUS、Oracle Cloud Infrastructure(OCI)IAM 認証はサポートされていません。

  • ユーザー定義型(UDT)、空間型(SDO_GEOMETRY)、コレクション型(VARRAY、ネストされたテーブル)、SYS.ANYDATA、REF、BFILE、バイナリ JSON(OSON)列などの複雑な Oracle 型や独自の Oracle 型はサポートされていません。バイナリ JSON 列をクエリするには、クエリでテキストにシリアル化します(JSON_SERIALIZE(column_name) や JSON_QUERY など)。

  • 制約のない NUMBER 列と計算された数値式は、切り捨てやオーバーフローなしで完全な精度を維持するために、BigQuery の STRING にマッピングされます。制約付きの NUMBER(p, s) 列は、NUMERIC(精度が 38 以下、スケールが 9 以下の場合)または BIGNUMERIC(スケールが 9 より大きいか、整数桁が 29 より大きい場合)にマッピングされます。

  • 固定長の CHAR(n) 列と NCHAR(n) 列は、BigQuery STRING にマッピングされるときに、長さ n までの末尾の空白パディングを保持します。

  • 1582 年 10 月 15 日より前の日付とタイムスタンプは、歴史的なグレゴリオ暦への移行により、10 日間のカレンダー シフトが発生する可能性があります。1582 年より前の正確な日付を保持するには、EXTERNAL_QUERY ステートメントで VARCHAR2 にキャストします。

サポートされている Oracle 環境とバージョン

クエリ連携は、次のデプロイ環境で Oracle データベースをサポートしています。

  • Oracle Database@Google Cloud
  • Oracle Exadata Database Service
  • Cloud VPN、Cloud Interconnect、またはインターネット経由のパブリック IP を介して Google Cloud に接続されたオンプレミスの Oracle インスタンス

クエリ連携では、次の Oracle バージョンがサポートされています。

  • Oracle Database 23.x(23ai)
  • Oracle Database 21.x
  • Oracle Database 19.x(19c)

始める前に

BigQuery 管理者が Oracle 接続を作成して、共有していることを確認します。

必要なロール

Oracle をクエリするのに必要な権限を取得するには、プロジェクトに対する BigQuery 接続ユーザー(roles/bigquery.connectionUser)の IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

データのクエリ

GoogleSQL クエリから Oracle に連携クエリを送信するには、EXTERNAL_QUERY 関数を使用します。

次の例は、mydataset.customers という名前の BigQuery の顧客レコードと、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;

Oracle テーブル スキーマを表示する

EXTERNAL_QUERY を介して Oracle データ ディクショナリ ビューにクエリを実行すると、分析を実行する前にデータベース メタデータの検査、テーブルの検出、列スキーマの確認を行うことができます。

アクセス可能なすべてのテーブルを一覧表示する

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''');

テーブルの列とデータ型を表示する

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''');

データ型マッピング

連携クエリを実行すると、BigQuery は次の表に従って Oracle のデータを GoogleSQL データ型に変換します。

Oracle のデータ型 BigQuery のデータ型
数値型
NUMBER(p, s)(p ≤ 38、s ≤ 9) NUMERIC
NUMBER(p, s)(s > 9 または p > 38) BIGNUMERIC
NUMBER(制約なしまたはフローティング スケール) STRING
FLOAT、FLOAT(p) FLOAT64
BINARY_FLOAT FLOAT64
BINARY_DOUBLE FLOAT64
文字型と文字列型
CHAR(n) STRING
NCHAR(n) STRING
VARCHAR2(n) STRING
NVARCHAR2(n) STRING
CLOB STRING
NCLOB STRING
LONG STRING
バイナリ型
RAW(n) BYTES
BLOB BYTES
LONG RAW BYTES
日付、時刻、間隔の型
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
行の識別タイプ
ROWID STRING
UROWID STRING
半構造化、ベクトル、XML タイプ
JSON(テキスト / テキスト シリアル化を使用した OSON) STRING
VECTOR STRING
XMLTYPE STRING

料金

連携クエリの実行にかかる費用は、次の 3 つの要因に基づきます。

  • Oracle でクエリを実行する際のコンピューティング費用(Oracle データベース プロバイダまたはホスティング環境によって課金されます)
  • Oracle から BigQuery にクエリ結果を転送する際の帯域幅費用(データベース ホスティング プロバイダからの下り(外向き)ネットワーク料金)
  • BigQuery でクエリを実行するコンピューティング費用

Oracle 関連の費用は、使用する Oracle サービスとホスティング環境の種類によって異なります。帯域幅コストを抑えるため、クエリは、最終結果の計算に不要な列と行をすべて除外するように、EXTERNAL_QUERY ステートメントに記述することをおすすめします。

BigQuery で連携クエリを実行しても追加料金は発生しません。BigQuery の料金の詳細については、料金をご覧ください。

接続で Google Cloud ネットワーキング コンポーネントを使用している場合は、次の料金も適用されることがあります。

次のステップ