執行 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資料欄和計算數值運算式會對應至 BigQuerySTRING,以保留完整精確度,不會截斷或溢位。受限制的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 網路元件,可能也適用下列定價:
後續步驟
- 瞭解如何連線至 Oracle。
- 進一步瞭解聯合查詢。
- 瞭解如何管理連結。