執行 Oracle 聯合查詢

資料分析師可以直接從 BigQuery 即時查詢 Oracle 中的關聯資料,不必複製或移動資料。

BigQuery Oracle 聯合查詢會使用 BigQuery Connection API 連線至 Oracle 資料庫引擎。接著,您可以使用 EXTERNAL_QUERY 函式,將 SQL 查詢直接傳送至 Oracle 執行,結果會直接串流傳回。

限制

Oracle 聯合查詢有下列限制:

  • 您只能透過 EXTERNAL_QUERY 函式執行唯讀查詢。不支援資料定義語言 (DDL) 和 data manipulation language (DML) 陳述式。
  • 只能透過 EXTERNAL_QUERY 函式存取聯合。不支援建立直接對應至 Oracle 資料表的 BigQuery 外部資料表或永久資料集。
  • 聯合查詢的延遲時間可能明顯高於直接在 Oracle 中執行查詢。
  • 基礎連線服務可能會讓閒置連線進入休眠狀態。閒置一段時間後,使用 Oracle 連線的第一個查詢可能需要超過一分鐘才能執行,因為連接器需要初始化。
  • 不支援 DNS 對接。您必須使用虛擬私有雲網路中的 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 資料庫使用者名稱和密碼驗證。不支援第三方識別資訊提供者、Kerberos、RADIUS 和 Oracle Cloud Infrastructure (OCI) IAM 驗證。

  • 不支援複雜或專屬的 Oracle 類型,例如使用者定義類型 (UDT)、空間類型 (SDO_GEOMETRY)、集合類型 (VARRAY、巢狀資料表)、SYS.ANYDATA、REF、BFILE 和二進位 JSON (OSON) 資料欄。如要查詢二進位 JSON 資料欄,請在查詢中將其序列化為文字 (例如使用 JSON_SERIALIZE(column_name) 或 JSON_QUERY)。

  • 無限制的 NUMBER 資料欄和計算數值運算式會對應至 BigQuery STRING,以保留完整精確度,不會截斷或溢位。受限制的 NUMBER(p, s) 資料欄會對應至 NUMERIC (精確度小於或等於 38,且小數位數小於或等於 9) 或 BIGNUMERIC (小數位數大於 9,或整數位數大於 29)。

  • 對應至 BigQuery STRING 時,固定長度的 CHAR(n) 和 NCHAR(n) 欄會保留結尾空白字元,直到長度達到 n。

  • 由於歷史上曾轉換為公曆,1582 年 10 月 15 日之前的日期和時間戳記可能會出現 10 天的日曆偏移。如要保留 1582 年之前的確切歷史日期,請在 EXTERNAL_QUERY 陳述式中將其轉換為 VARCHAR2。

支援的 Oracle 環境和版本

查詢聯合支援下列部署環境中的 Oracle 資料庫:

  • Oracle Database@Google Cloud
  • Oracle Exadata Database Service
  • 地端部署 Oracle 執行個體透過 Cloud VPN、Cloud Interconnect 或網際網路上的公開 IP 連線至 Google Cloud

查詢聯合支援下列 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 函式。

以下範例是聯合查詢,會將 BigQuery 中名為 mydataset.customers 的客戶記錄,與 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

定價

執行聯合查詢的費用取決於下列三項因素:

  • 在 Oracle 執行查詢的運算費用 (由 Oracle 資料庫供應商或託管環境收取)
  • 將查詢結果從 Oracle 移轉至 BigQuery 的頻寬費用 (資料庫代管服務供應商收取的輸出網路費用)
  • 在 BigQuery 執行查詢的運算費用

任何與 Oracle 相關的費用,都取決於您使用的 Oracle 服務類型和託管環境。為限制頻寬成本,建議您在 EXTERNAL_QUERY 陳述式中編寫查詢,排除計算最終結果時不需要的所有資料欄和資料列。

在 BigQuery 執行聯合查詢不會產生額外費用。如要進一步瞭解 BigQuery 定價,請參閱「定價」一文。

如果連線使用 Google Cloud 網路元件,可能也適用下列定價:

後續步驟