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)列は、BigQuerySTRINGにマッピングされるときに、長さ 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 ネットワーキング コンポーネントを使用している場合は、次の料金も適用されることがあります。
次のステップ
- Oracle に接続する方法を確認する。
- 連携クエリの詳細を確認する。
- 接続の管理について確認する。