全球查詢
全域查詢可讓您執行 SQL 查詢,參照儲存在多個區域的資料。舉例來說,您可以執行全域查詢,將 us-central1 中的資料表與 europe-central2 中的資料表聯結。本文說明如何在專案中啟用及執行全域查詢。
事前準備
確認專案已啟用全域查詢,並確保您具備執行全域查詢的必要權限。
啟用全域查詢
如要為專案或機構啟用全域查詢,請使用 ALTER PROJECT SET OPTIONS 陳述式或 ALTER ORGANIZATION SET OPTIONS 陳述式變更預設設定。
- 如要在某個區域執行全域查詢,請在執行查詢的專案中,將該區域的
enable_global_queries_execution引數設為true。 - 如要允許全域查詢從某個地區複製資料,請在儲存資料的專案中,將該地區的
enable_global_queries_data_access引數設為true。 - 全域查詢可以在一個專案中執行,並從另一個專案的其他區域提取資料。
以下範例說明如何在專案層級修改這些設定。 假設您想在專案 PROJECT_1_ID 的 REGION_1 區域中執行全域查詢,並從專案 PROJECT_2_ID 的 REGION_2 區域中提取資料:
ALTER PROJECT `PROJECT_1_ID` SET OPTIONS ( `region-REGION_1.enable_global_queries_execution` = true ); ALTER PROJECT `PROJECT_2_ID` SET OPTIONS ( `region-REGION_2.enable_global_queries_data_access` = true );
更改下列內容:
PROJECT_1_ID:執行全域查詢的專案名稱REGION_1:執行全域查詢的區域PROJECT_2_ID:全域查詢要從中提取資料的專案名稱REGION_2:全域查詢要從哪個區域提取資料
變更可能需要幾分鐘才會生效。
必要權限
您必須具備 bigquery.jobs.createGlobalQuery 權限,才能執行全域查詢。
只有 BigQuery 管理員這個預先定義的角色具備這項權限。如要授予執行全域查詢的權限,但不要授予 BigQuery 管理員角色,請按照下列步驟操作:
- 建立自訂角色,例如「BigQuery 全域查詢執行者」。
- 將
bigquery.jobs.createGlobalQuery新增至這個角色。 - 將這個角色指派給所選使用者或服務帳戶。
查詢資料
如要執行全域查詢,請編寫 SQL 查詢,就像資料位於單一位置一樣。如果查詢參照的資料儲存在多個位置,BigQuery 會嘗試執行全域查詢。在某些情況下,BigQuery 會自動選取查詢位置。否則,您必須指定要執行查詢的位置。查詢參照的資料若不在所選位置,系統會將資料複製到該位置。
以下範例會以全域查詢的形式執行,合併儲存在兩個不同位置的兩個不同資料集中的資料表:
SELECT id, tr_date, product_id, price FROM us_dataset.transactions
UNION ALL
SELECT id, tr_date, product_id, price FROM europe_dataset.transactions
自動選取位置
在下列情況下,系統會自動決定查詢的執行位置,且無法變更:
- 資料修改語言查詢 (
INSERT、UPDATE、DELETE陳述式) 一律會在目標資料表的位置執行。 - 資料定義語言查詢 (例如
CREATE TABLE AS SELECT陳述式) 一律會在資源建立或修改的位置執行。 - 如果查詢指定了目標資料表,一律會在目標資料表所在位置執行。
選擇一個位置
一般來說,您可以決定要執行全域查詢的位置。如要做出這項決定,請考慮下列事項:
全域查詢會暫時將資料從一個位置複製到另一個位置。如果貴機構對資料落地有任何規定,且您不希望位置 A 的資料離開位置 A,請將查詢位置設為 A。
如要盡量減少位置之間傳輸的資料量,並降低查詢費用,請在儲存最多查詢資料的區域中執行查詢。
假設你有一家網路商店,並在 us-central1 地點維護產品清單,但交易發生在 us-south1 區域。如果目錄中的產品數量少於交易次數,請在 us-south1 區域執行查詢。
瞭解全球查詢
如要以高效率且符合成本效益的方式執行全域查詢,請務必瞭解查詢的執行機制。
如要使用位於不同位置的資料,必須將資料複製到一個位置。以下是 BigQuery 執行的全域查詢工作流程抽象化:
- 判斷查詢必須從使用者聲明或自動執行。這個位置稱為「主要」位置,查詢參照的所有其他位置則稱為「遠端」位置。
- 在每個遠端區域執行子查詢,收集完成主要區域查詢所需的資料。
- 將這項資料從遠端位置複製到主要位置。
- 將資料儲存在主要位置的臨時資料表中 8 小時。
- 使用主要位置收集的所有資料執行最終查詢。
- 傳回查詢結果。
BigQuery 會盡量減少區域間的資料傳輸量。請見如下範例:
SET @@location = 'EU';
SELECT
t1.col1, t2.col2
FROM
eu_dataset.table1 t1
JOIN us_dataset.table2 t2 using col3
WHERE
t2.col4 = 'ABC'
BigQuery 不必將資料表 t2 的所有內容從美國複製到歐盟。只要轉移要求的資料欄 (col2 和 col3) 和符合 WHERE 條件的資料列 (t2.col4 = 'ABC') 即可。不過,這些機制 (稱為「下推」) 取決於查詢結構,有時轉移的資料量可能很大。建議您對一小部分資料測試全域查詢,並確認資料只會在需要時轉移。
觀測能力
如要查看傳送至遠端區域的查詢文字,請查看工作記錄。遠端工作與原始查詢具有相同的工作 ID,但會加上 _xregion 後置字元。
關閉全域查詢
如要為專案或機構停用全域查詢,請使用 ALTER PROJECT SET OPTIONS statement 或 ALTER ORGANIZATION SET OPTIONS statement 變更預設設定。
- 如要在特定區域停用全域查詢,請將該區域的
enable_global_queries_execution引數設為false或NULL。 - 如要禁止全域查詢從某個區域複製資料,請在該區域將
enable_global_queries_data_access引數設為false或NULL。
以下範例說明如何在專案層級停用全域查詢:
ALTER PROJECTPROJECT_IDSET OPTIONS ( `region-REGION.enable_global_queries_execution` = false, `region-REGION.enable_global_queries_data_access` = false );
更改下列內容:
PROJECT_ID:要變更的專案名稱REGION:要停用全域查詢的區域名稱
變更可能需要幾分鐘才會生效。
定價
全域查詢的費用包含下列項目:
- 遠端位置中每個子查詢的運算費用,取決於這些位置的定價模式
- 最終查詢在執行所在區域的運算費用,取決於該區域的計費模式
- 根據資料複製定價,在不同位置之間複製資料的費用
- 根據儲存空間定價,將資料從遠端地區複製到主要地區 (8 小時) 的費用
配額
如要瞭解有關全域查詢的配額,請參閱「查詢工作」。
限制
- 查詢的執行詳細資料和執行圖表不會顯示從遠端位置處理及轉移的位元組數。這項資訊會顯示在複製作業中,您可以在作業記錄中找到這些作業。全域查詢建立的複製工作 ID,會以查詢工作 ID 做為前置字串。
- 沙箱模式不支援全域查詢
- 由於需要在區域之間轉移資料,全域查詢的延遲時間會比單一區域查詢長。
- 全域查詢不會使用任何快取,以免在區域之間轉移資料。
- 您無法使用全域查詢查詢偽資料欄,例如
_PARTITIONTIME。 - 您無法使用彈性資料欄名稱搭配全域查詢來查詢資料欄。
- 在
WHERE子句中參照 BigLake 資料表的資料欄時,無法使用RANGE或INTERVAL常值。 - 不支援全域已授權檢視表和已授權常式 (當一個位置的檢視表或常式獲授權存取另一個位置的資料集時)。
- 系統不支援對全域查詢建立具體化檢視表。
- 如果全域查詢參照
STRUCT資料欄,系統不會對任何遠端子查詢套用下推。為提升效能,建議您在遠端區域中建立檢視區塊,篩選STRUCT欄並只傳回必要欄位做為個別欄。 - 全域查詢不會以不可分割的方式執行。如果資料複製作業成功,但整體查詢失敗,您仍須支付資料複製費用。
- 如果設定用於加密全域查詢結果的 CMEK 金鑰 (在資料表、資料集或專案層級),是全域金鑰,則在遠端區域建立的暫時資料表 (做為全域查詢執行作業的一部分),只會使用客戶自行管理的加密金鑰 (CMEK) 加密。為確保遠端臨時資料表一律使用 CMEK 保護,請為在遠端區域執行全域查詢的專案設定預設 KMS 金鑰。
- Assured Workloads 不支援全域查詢。
- 在全域查詢中,每個區域最多可查詢 10 個資料表。