最佳化載入工作

在 BigQuery 中,您可以透過批次寫入、串流頻繁更新和分區目的地資料表,將用量控制在每個資料表的載入工作限制內。每日修改配額是固定的,無法提高,因此請減少寫入次數並增加寫入量,並使用內建的用戶端重試功能,避免發生 quotaExceeded 錯誤。

資料表作業配額的運作方式

無論是附加或更新資料,還是截斷資料表,BigQuery 對於每個專案中每張資料表每天的修改次數限制都是固定的。這項限制包含所有載入工作、複製工作和查詢工作的總和,這些工作會新增或覆寫目的地資料表。

載入工作有補充率。如果超過資料表作業限制或補充率,載入工作會失敗,並顯示 quotaExceeded 錯誤。專案層級的每日載入工作數量限制,會在 24 小時內重新計算。載入工作完成後,可用配額會減少。配額會在接下來 24 小時內逐漸恢復。失敗的載入工作仍會計入每份資料表和每項專案的配額。如要進一步瞭解載入工作限制,請參閱「載入工作」。

如果是分區資料表,則適用分區資料表修改限制,取代標準資料表限制。

為避免超出每日資料表作業限制,請將作業分散在 24 小時內執行。舉例來說,如果您執行 25 次更新,每次更新有 60 項作業,則每 58 分鐘可以執行約 60 項作業。這個方法有助於達到每日上限。如要監控資料表更新,請參閱「BigQuery INFORMATION_SCHEMA 檢視表」。

不計入配額的資料表作業

更新資料表資訊 (中繼資料) 和使用 DML 陳述式,不會計入每日資料表修改限制。這項排除條件適用於標準和分區資料表。

專案可執行的 DML 陳述式數量不限。DML 陳述式先前會計入每日資料表修改次數,即使達到上限也不會受到限制,但現在已不再如此。

串流資料即時插入也會修改資料表,但受專屬配額規範。

載入策略,避免超出資料表作業限制

為避免超出 BigQuery 的每日資料表作業限制,請考慮採用下列最佳做法:

  • 減少寫入次數,但每次寫入較多資料,而非多次寫入少量資料。
  • 盡量減少每天對最終正式環境資料表執行的個別寫入工作。

如要採用這些最佳做法,請將資料批次或串流載入 BigQuery。選擇載入方法時,請考量是否需要即時載入大量資料,或是否不需即時載入。以下各節將詳細說明批次載入和資料串流,包括每種方法可使用的工具和服務。

批次載入

為避免超出 BigQuery 專案的每日載入限制,請將大量資料分批,並以較少的工作載入 BigQuery。以下各節說明幾種批次載入資料的方法。

載入每項工作的更多資料

不要在每次有新資訊時就將資料傳送至 BigQuery,而是使用單一大型工作收集資料並載入 BigQuery。

舉例來說,您可以等到檔案 (例如 CSV 或 JSON 檔案) 中累積數千列資料後,再執行一項載入工作,將所有資料附加至資料表,而不是每隔幾列資料就執行一項載入工作。即使工作包含更多資料,這項動作仍算是一項資料表作業。您可以在載入工作中使用萬用字元,批次處理檔案。您可以使用萬用字元選取目錄中的多個檔案,在單一載入工作中載入多個檔案。

以下範例說明如何搭配使用萬用字元和 bq load 指令或 SQL LOAD DATA 查詢。

bq

以下範例顯示 bq load 指令,可將 Cloud Storage 中的 CSV 資料載入名為 my_target_table 的 BigQuery 資料表。如要選取多個來源檔案名稱,請在指令中使用萬用字元。AUTODETECT 旗標會自動根據 Cloud Storage 中的來源資料判斷資料表結構定義,並支援萬用字元 (*),可將符合特定命名模式的多個檔案載入 BigQuery 資料表。

bq load \
  --source_format=CSV \
  --autodetect \
  --project_id=PROJECT_ID \
  DATASET_NAME.TABLE_NAME \
  "gs://BUCKET_NAME/OBJECT_PATH_WILDCARD"

更改下列內容:

  • PROJECT_ID: Google Cloud 專案的 ID。
  • DATASET_NAME:要載入資料的 BigQuery 資料集名稱。
  • TABLE_NAME:要載入資料的 BigQuery 資料表名稱。
  • BUCKET_NAME:包含來源檔案的 Cloud Storage bucket 名稱。
  • OBJECT_PATH_WILDCARD:Cloud Storage bucket 中 CSV 檔案的路徑。加入萬用字元 (*) 即可比對多個檔案。舉例來說,字串 gs://my-bucket/path/to/data/my_prefix_*.csv 使用萬用字元 * 載入 gs://my-bucket/path/to/data/ 中所有以 my_prefix_ 開頭並以 .csv 結尾的檔案。

如要瞭解詳情,請參考下列資源:

SQL

以下範例說明如何使用 SQL LOAD DATA 查詢,將 Cloud Storage bucket 中的 CSV 資料載入 BigQuery 資料表。如要選取多個來源檔案名稱,請在指令中使用萬用字元。

LOAD DATA INTO
DATASET_NAME.TABLE_NAME
FROM FILES (
  format = 'SOURCE_FORMAT',
  uris = ['gs://BUCKET_NAME/OBJECT_PATH_WILDCARD]
  );

更改下列內容:

  • DATASET_NAME:要載入資料的 BigQuery 資料集名稱。
  • TABLE_NAME:要載入資料的 BigQuery 資料表名稱。
  • SOURCE_FORMAT 會設定來源檔案的類型,例如 CSV 或 JSON。在本範例中,請使用 CSV。
  • BUCKET_NAME:包含來源檔案的 Cloud Storage bucket 名稱。
  • OBJECT_PATH_WILDCARD:Cloud Storage bucket 中 CSV 檔案的路徑。加入萬用字元 (*) 即可比對多個檔案。舉例來說,字串 gs://my-bucket/path/to/data/my_prefix_*.csv 使用萬用字元 * 載入 gs://my-bucket/path/to/data/ 中所有開頭為 my_prefix_ 且結尾為 .csv 的檔案。

詳情請參閱「GoogleSQL 中的載入陳述式」。

使用 BigQuery Storage Write API (gRPC) 批次載入

如要將批次資料載入 BigQuery,其中一個方法是使用 Google API 用戶端程式庫,直接從應用程式使用 Storage Write API (gRPC)。

Storage Write API (gRPC) 會最佳化資料載入作業,確保不超出資料表限制。如要進行高流量的即時串流,請使用 PENDING 串流,而非 COMMITTED 串流。使用 PENDING 串流時,API 會暫時儲存記錄,直到您提交串流為止。

如需使用 Storage Write API 批次載入資料的完整範例,請參閱「使用 Storage Write API 批次載入資料」。

使用 Dataflow 批次載入

如要使用資料管道,將資料串流、轉換並寫入 BigQuery,可以使用 Dataflow。您建立的資料管道會從支援的來源 (例如 Pub/Sub 或 Apache Kafka) 讀取資料。您也可以使用 BigQueryIO 連接器建立 Dataflow 管道,該連接器會使用 Storage Write API (gRPC) 進行高效能資料串流,並採用「僅限一次」語意。

如要瞭解如何使用 Dataflow 將資料批次載入 BigQuery,請參閱「從 Dataflow 寫入 BigQuery」。

資料串流

如要載入大量資料並頻繁更新,建議您將資料串流至 BigQuery。透過資料串流,新的資料會持續從用戶端應用程式寫入 BigQuery,這項策略可避免達到執行過多載入工作的限制。以下各節將說明幾種將資料串流至 BigQuery 的方法。

使用 Storage Write API (gRPC) 串流資料

使用 Storage Write API (gRPC),以極低的延遲時間將記錄即時串流至 BigQuery。Storage Write API (gRPC) 提供高效率的串流協定,可提供進階功能,例如僅傳送一次語意、偵測結構定義更新,以及串流變更資料擷取 (CDC) upsert。此外,每月最多可免費擷取 2 TiB。

如要瞭解如何使用 Storage Write API (gRPC),請參閱「使用 Storage Write API 串流資料」。

使用 Dataflow 串流資料

使用 Dataflow 建立資料管道,從支援的來源 (例如 Pub/Sub 或 Apache Kafka) 讀取資料。接著,這些管道會轉換資料,並將資料寫入 BigQuery 目的地。您可以使用 BigQueryIO 連接器建立 Dataflow 管道,該連接器會使用 Storage Write API (gRPC)。

如要瞭解如何使用 Dataflow 將資料串流至 BigQuery,請參閱「從 Dataflow 寫入 BigQuery」。

管理載入資料表的最佳做法

除了將資料批次載入或串流至 BigQuery 之外,您也可以透過下列方式管理資料表,針對資料擷取作業進行最佳化。

使用分區資料表

資料表分區是一項強大的技術,可用於管理 BigQuery 中的大型資料表,尤其是在需要頻繁執行資料載入作業時。您可以根據日期、時間戳記或整數,將資料表拆分成較小、較易管理的區段,大幅提升資料表效能和成本效益。

分區載入資料的主要優點,在於 BigQuery 的每日資料表作業配額是以分區層級 (而非資料表層級) 套用。如果是分區資料表,分區修改會採用獨立且更高的上限,取代標準資料表上限。分區資料表的限制大幅提高,您每天可執行的載入工作數量也隨之增加,且不會達到配額限制。

常見且非常有效的策略是批次載入每日資料。舉例來說,您可以將 2025-09-18 的所有當日資料收集到暫時的暫存資料表中。接著,在一天結束時,您會執行單一工作,將這些資料載入主要正式資料表中當天的特定分區。由於 BigQuery 只會與單一分區的資料互動,因此這種方法可讓資料井然有序,並加快載入作業速度及降低成本。

雖然強烈建議對大型且不斷成長的資料表進行分區,但如果分區一律小於 10 GB,最好避免分區。詳情請參閱「何時應使用分區」。

如要進一步瞭解可用的不同分區方法,例如時間單位和整數範圍分區,請參閱「分區資料表類型」。

利用內建的指數輪詢、截斷和抖動功能

內建的指數輪詢和重試是一種錯誤處理方法,可在作業暫時失敗時,協助應用程式順利復原。這類失敗可能包括頻率限制錯誤 (rateLimitExceeded) 或短暫的網路問題 (unavailable)。

在可靠的系統中,從用戶端佇列中擷取工作的工作站也會使用指數輪詢和重試。呼叫 BigQuery 時,他們會執行這項操作,建立兩層防護。

舉例來說,Python 的官方 google-cloud-bigquery-storage 程式庫包含內建的重試邏輯,並採用指數輪詢。這項邏輯會處理暫時性 gRPC 錯誤,例如 UNAVAILABLE。在多數情況下,您不需要自行編寫這類重試程式碼。client.append_rows() 呼叫會自動處理這些重試作業。

這項內建處理功能是使用官方用戶端程式庫的一大優勢。您只需要處理無法重試的錯誤,例如 INVALID_ARGUMENT,這表示結構定義不相符。