定價

總覽

BigQuery 提供可彈性調整的價格方案,能滿足各式各樣的技術和預算需求。

儲存空間費用取決於儲存在 BigQuery 的資料量,可分為以下兩種:

  • 動態儲存月費:採計您過去 90 天內修改過的資料表或分區中儲存的資料量。
  • 長期儲存月費 - 採計您過去 90 天內未修改過的資料表或分區中儲存的資料量 (費用較低)。

查詢費用則有兩種計費模式可以選擇:

  • 以量計價:這是最具彈性的選項,以量計價的價格取決於您執行的每個查詢所處理的資料量。
  • 固定費率:這個計價選項適合希望事先知道費用的客戶。採用固定費率的客戶是購買專屬的查詢處理資源,因此不必支付個別查詢的費用。

如要進一步瞭解儲存空間和查詢的價格,請參閱 Google Cloud SKU。請注意,以量計價的查詢價格是指 SKU 頁面上的「分析價格」

定價摘要

下表大致列出 BigQuery 的計價方式,這些作業適用 BigQuery 的使用配額與限制

計費方式

您建立的每項專案都會連結至一個帳單帳戶,在專案中執行 BigQuery 工作產生的所有費用都會計入該帳單帳戶。此外,BigQuery 儲存空間的相關費用也會計入與專案相連結的帳單帳戶中。

如何分析帳單資料

您可以在 Cloud Console 的「Cloud Billing」報表頁面中查看 BigQuery 的費用和趨勢。如要瞭解如何透過報表解讀自己的帳單資料,請參閱查看帳單報表和支出趨勢一文。

如要瞭解如何透過 BigQuery 分析帳單資料,請參閱 Cloud Billing 說明文件中的將 Cloud Billing 資料匯出至 BigQuery 一文。

免費作業項目

下表列出適用於所有地區的 BigQuery 免費作業項目,這些作業適用 BigQuery 的使用配額與限制

作業 說明
正在載入資料

從 Cloud Storage 或本機檔案將資料載入 BigQuery 無須支付費用。如果在 Cloud Storage 儲存資料,則須付費。詳情請參閱 Cloud Storage 定價頁面上的資料儲存一節。資料載入至 BigQuery 後,則須按照 BigQuery 的儲存空間定價支付費用。

如果目標資料集位於 US 多地區,從任何其他地區的 Cloud Storage 值區載入資料皆不會產生網路輸出費用。詳情請參閱位置注意事項

複製資料 複製資料表不必付費,但儲存新的資料表和您所複製的資料表必須付費。詳情請參閱複製現有資料表的相關說明。
匯出資料 您從 BigQuery 將資料匯出至 Cloud Storage 時,不必支付匯出作業的費用,但必須支付在 Cloud Storage 中儲存資料的費用。詳情請參閱 Cloud Storage 定價頁面上的資料儲存一節,以及從 BigQuery 匯出資料的相關說明。
刪除資料集 刪除資料集不必付費。
刪除資料表、檢視表、分區和函式 刪除資料表、檢視表、個別資料表分區或使用者定義函式都不必付費。
中繼資料作業 您不必支付 list、get、patch、update 和 delete 的呼叫費用,其中包含但不限於以下項目:列出資料集、更新資料集的存取控制清單、更新資料表的說明,或是列出資料集內的使用者定義函式。
讀取虛擬資料欄 查詢下列虛擬資料欄的內容無須付費:

_TABLE_SUFFIX:在查詢萬用字元資料表時使用
_PARTITIONDATE:在查詢擷取時間分區資料表時使用
_PARTITIONTIME:在查詢擷取時間分區資料表時使用
_FILE_NAME:在查詢以外部資料來源為基礎的資料表時使用
讀取中繼資料表 查詢下列中繼資料表的內容無須付費:

__PARTITIONS_SUMMARY__:在取得分區資料表或擷取時間分區資料表中的分區相關中繼資料時使用
__TABLES_SUMMARY__:在取得資料集中的資料表和檢視表相關中繼資料時使用
建立、替換或呼叫 UDF 建立、替換或叫用永久的使用者定義函式 (UDF) 不必付費。

「一律免費」的用量限制

Google Cloud 免費方案可讓使用者免費使用部分 BigQuery 資源,直到達到相關的配額上限為止。在免費試用期間或試用期結束後,只要用量未超出限制,即可免費使用特定資源。免費試用期結束後,如果用量超出限制,系統就會根據本頁列出的價格向您收費。

資源 每月免費用量限制 說明
儲存空間 每個月的前 10 GB 免費。 BigQuery ML 模型和儲存在 BigQuery 中的訓練資料均包含在 BigQuery 儲存空間的免費方案中。
查詢 (分析) 每個月處理的前 1 TB 查詢資料免費。 使用 BigQuery ML 預測、檢查及評估函式的查詢包含在 BigQuery 分析的免費方案中,但內含 CREATE MODEL 陳述式的 BigQuery ML 查詢除外。
偏好每個月支付固定費用的高用量客戶,也可選擇 BigQuery 固定費率計價方式
BigQuery ML CREATE MODEL 查詢 包含 CREATE MODEL 陳述式的查詢每個月可以免費處理前 10 GB 的資料。 BigQuery 分析的免費方案不含 BigQuery ML CREATE MODEL 查詢,且只適用於 BigQuery ML 內建的模型 (在 BigQuery 中訓練的模型)。

查詢定價

查詢的價格是指執行 SQL 指令、使用者定義函式,以及符合條件的資料操縱語言 (DML)資料定義語言 (DDL) 陳述式時產生的費用。

BigQuery 提供兩種計費模式:

  • 以量計價是具備彈性與效率的計費模式。系統僅會根據您執行的查詢向您收取費用。
  • 固定費率採用每月收取固定費用的計費模式,您可事先知道自己必須負擔多少費用。

根據預設,系統會按照以量計價的模式向您收費。您可以針對個別特定專案和位置組合將計費模式變更為固定費率,或者在以量計價和固定費率兩種計費模式之間進行選擇。

以量計價

如果您選用以量計價的模式,BigQuery 會根據「處理的位元組數」(也稱為讀取的位元組數) 這項指標,來收取執行查詢作業的費用。無論資料是儲存在 BigQuery,還是 Cloud Storage、雲端硬碟或 Cloud Bigtable 等外部資料來源,您都必須依照系統處理的位元組數付費。費用完全取決於用量。

以量計價模式的查詢價格如下:

請留意下列查詢費用相關事項:

  • BigQuery 採用資料欄式資料結構。系統會根據您所選資料欄中處理的資料總量向您收費,每個資料欄中的資料總量則是按照資料欄中資料的類型計算。如要進一步瞭解資料量的計算方式,請參閱資料量的計算方式一節。
  • 如果查詢作業傳回錯誤訊息或是從快取中擷取結果,則您不必付費。
  • 資料量會四捨五入至最接近的 MB 數。針對查詢所參照的每個資料表,系統處理的資料量基本額度為 10 MB,每項查詢作業處理的資料量基本額度也同樣是 10 MB。
  • 即便您取消正在執行的查詢工作,該項作業還是可能產生費用,且價格最高等同於完整執行作業須支付的全額費用。
  • 當您執行查詢時,系統會根據您所選資料欄中處理的資料量向您收費,即使您已明確對結果設定 LIMIT 也是如此。
  • 將資料表分區分群有助於降低查詢處理的資料量。為達到最佳做法的成效,請盡可能採用分區和分群的做法。
  • 以量計價的查詢價格是指 Google Cloud SKU 頁面上所列的分析價格。

在以量計價模式下控制查詢成本

BigQuery 提供成本管理功能,可讓您將查詢的成本控制在一定額度內。您可以設定下列項目:

查詢 Cloud Storage 資料

從 BigQuery 查詢外部資料來源時,系統會針對查詢讀取的位元組數向您收費。詳情請參閱查詢的定價。在 Cloud Storage 中儲存資料也須支付相關費用。詳情請參閱 Cloud Storage 定價一文。

在 Cloud Storage 中查詢欄位式格式

如果您的外部資料是以 ORC 或 Parquet 格式儲存,計費的位元組數僅限於 BigQuery 讀取的資料欄。由於外部資料來源的資料類型是經由查詢轉換為 BigQuery 資料類型,因此系統會根據 BigQuery 資料類型大小計算讀取的位元組數。如需資料類型轉換的資訊,請參閱下列頁面:

固定費率計價方式

想要支付固定查詢作業費用的客戶可以選用 BigQuery 的固定費率計價方式,而不必根據系統實際處理的資料量 (以 TB 為單位) 付費。

您可選擇使用搭配 BigQuery 保留項目的固定費率方案。

註冊固定費率的計價方案時,您購買的運算單元承諾使用價格 (也就是查詢處理作業專用資料量) 是以 BigQuery 運算單元為計算單位。您執行的查詢作業會耗用這個資料量,且不須為系統處理的位元組數支付費用。如果您的容量需求超過承諾使用價格容量,BigQuery 會將運算單元累積在佇列中,因此您不必支付額外費用。如要進一步瞭解 BigQuery 如何利用運算單元進行查詢處理,請參閱運算單元一文。

固定費率計價方式:

  • 適用於查詢費用,包括 BigQuery ML、DML 和 DDL 陳述式。
  • 不適用於儲存空間串流擷取或 BI Engine 費用。
  • 僅可做為地區性資源購買。在某個地區或多地區購買的運算單元使用承諾,無法用於其他地區或多地區,且無法移動。
  • 客戶可聯絡 Google Cloud 支援團隊來提高每項專案的並行配額。
  • 提供按秒方案、月約方案和年約方案。
  • 可由整個機構共用,不須為每項專案購買運算單元承諾使用價格
  • 運算單元數量至少為 100 個,且以 100 個運算單元為遞增量購買。
  • 系統在承諾使用價格期間會以秒計費。

每月固定費率的承諾使用價格

下表列出運算單元使用承諾的月約方案費用。

每年固定費率的使用承諾

下表列出運算單元使用承諾的年約方案費用。

彈性運算單元:短期使用承諾

彈性運算單元是一種特別的使用承諾類型:

  • 承諾使用時間長度僅為 60 秒。
  • 之後您隨時都可以取消彈性運算單元,
  • 系統只會針對您的使用承諾部署秒數向您收費。

彈性運算單元取決於運算能力可用性,當您嘗試購買彈性運算單元時,我們不保證能成功購買。不過,一旦您成功購買使用承諾後,系統便會保證提供足夠的運算能力,直到您取消為止。

下表列出彈性運算單元使用承諾的費用。

試用運算單元 (促銷活動)

我們在 2020 年 5 月 22 日,為 BigQuery 的新客戶和回流客戶推出了一項 BigQuery 限量促銷活動。符合資格的客戶可享有高額折扣,以極為優惠的費率購買「試用運算單元」,可購買的運算單元數量為 500 個,約期為 6 個月。

試用運算單元的相關規定與說明如下:

  • 必須綁約 6 個月。
  • 自購買當下起算,182 天內不能取消。
  • 每位客戶只能購買 500 個運算單元。
  • 若購有其他類型的使用承諾,可以與試用運算單元合併使用。
  • 試用運算單元僅適用於美國和歐盟的多地區。
  • 試用運算單元具有限量供應性質,本公司會依照申請順序提供,額滿為止。
  • 試用運算單元和其他類型的運算單元使用承諾,在效能或可用性上並沒有任何差別。

只有特定客戶才能購買試用運算單元,相關資格說明如下:

  • 申請使用 BigQuery 的 Google Cloud 新客戶
  • 申請使用 BigQuery 的 Google Cloud 現有客戶
  • 過去 3 個月以來,每月支出皆未超過 $500 美元的 BigQuery 現有客戶
  • 使用公司電子郵件地址申請的客戶
  • 直接向 Google 申購本優惠方案的客戶。請注意,經銷商或配銷商並無法提供上述方案

如要進一步瞭解試用運算單元的運作方式,請參閱試用運算單元的相關說明。

如要參加這項促銷活動,請填寫 BigQuery 試用運算單元促銷活動表單,我們會在五個工作天內回覆您。

儲存空間定價

將資料載入至 BigQuery 後,您就必須支付資料儲存費用。系統會根據資料表中儲存的資料量 (在未經壓縮的狀態下) 計算儲存空間費用。

資料量是以個別資料欄中的資料類型做為計算依據。如要深入瞭解資料量的計算方式,請參閱資料量的計算方式一節。

動態儲存

動態儲存的價格如下:

儲存空間價格是以每秒每 MB 按比例計算。以下舉例說明儲存空間的使用方式和您必須支付的費用:

  • 半個月 100 MB,您必須支付 $0.001 美元 (十分之一美分)
  • 半個月 500 GB,您必須支付 $5 美元
  • 一個月 1 TB,您必須支付 $20 美元

長期儲存

如果資料表連續 90 天都未經編輯,系統會自動將儲存空間價格調降約 50%。資料表經系統歸類至長期儲存模式後,效能、耐用性和可用性都不會下降,其他功能也不會受損,因此請您放心。

在判斷資料是否適用長期儲存價格時,系統會將分區資料表中的每個分區視為獨立的單位。如果某個資料表分區在過去 90 天內未經修改,該分區中的資料使用方式就會歸類為長期儲存,並以折扣價格計費。

長期儲存的費用如下:

資料表經過編輯之後,就會恢復為標準儲存價格,先前累計的 90 天閒置期也會歸零並重新開始計算。任何修改資料表的動作都會讓計時器歸零,包括:

動作 說明
將資料載入至資料表 將資料附加至目的地資料表或覆寫目的地資料表的任何載入或查詢作業。
將資料複製到資料表 將資料附加至目的地資料表或覆寫目的地資料表的任何複製作業。
將查詢結果寫入資料表 將資料附加至目的地資料表或覆寫目的地資料表的任何查詢作業。
使用資料操縱語言 (DML) 使用 DML 陳述式來修改資料表中的資料。
使用資料定義語言 (DDL) 使用 CREATE OR REPLACE TABLE DDL 陳述式來替換資料表。
將資料串流至資料表 使用 tabledata.insertAll API 呼叫來擷取資料。

其他作業均不會重設計時器,這些作業包括:

  • 查詢資料表
  • 建立可查詢資料表的檢視表
  • 從資料表匯出資料
  • 將資料表複製到另一個目的地資料表
  • 修補或更新資料表資源

如果資料表在單一帳單週期內達到 90 天的門檻,其儲存空間價格就會按比例計算。

長期儲存價格只適用於 BigQuery 儲存空間,並不適用於 Cloud Bigtable、Cloud Storage 和雲端硬碟等外部資料來源中儲存的資料。

BigQuery Storage API 定價

BigQuery Storage API 採以量計價的收費模式,因此系統會根據您讀取的資料量向您收費。採固定費率計價的客戶可以使用 BigQuery Storage API 每月免費讀取最多 300 TB 的資料量。如果每月讀取的資料量超過 300 TB,系統會按照以量計價的方式收費。

以量計價

在以量計價模式中,BigQuery Storage API 的費用取決於向 ReadRows 發出的呼叫在 BigQuery 儲存空間中讀取的位元組數。

讀取的位元組數包含用於篩選但未以輸出內容形式傳回給您的 ReadRows 資料。透過臨時資料表讀取的資料不會計費。

BigQuery Storage API 以量計價的收費方式如下:

請留意下列 BigQuery Storage API 費用相關事項:

  • 系統會依據讀取的資料總量向您收費。每個資料欄的讀取資料總量取決於資料欄的資料類型,而資料量是以資料欄的資料類型為計算依據。如要深入瞭解資料量的計算方式,請參閱資料量的計算方式一節。
  • 即使 ReadRows 呼叫失敗,系統仍會根據您在讀取工作階段中讀取的資料量收費。
  • 如果您在串流結束前就先行取消 ReadRows 呼叫,系統會根據取消前已讀取的資料量向您收費。即使是 ReadRows 呼叫取消前尚未回傳給您的資料,只要系統已經讀取,那麼這些資料就仍會產生費用。
  • 為達到最佳做法的成效,請盡可能採用分區資料表和叢集資料表。您可以使用 WHERE 子句修剪分區,藉此減少資料讀取量。詳情請參閱查詢分區資料表一節。

資料量的計算方式

在您查詢資料或將資料載入至 BigQuery 時,系統會依據該筆資料的大小向您收取費用,資料量的計算方式則視各欄的資料類型大小而定。

您儲存的資料大小與您的查詢作業處理的資料量計算單位為 GB,而 1 GB 等於 230 個位元組,這種計算單位又稱為 GiB。同理,1 TB 為 240 個位元組 (1,024 GB)。

BigQuery 各資料類型的大小資訊如下:

資料類型 大小
INT64/INTEGER 8 個位元組
FLOAT64/FLOAT 8 個位元組
NUMERIC 16 個位元組
BOOL/BOOLEAN 1 個位元組
STRING 2 個位元組 + UTF-8 編碼的字串大小
BYTES 2 個位元組 + 值中的位元組數
DATE 8 個位元組
DATETIME 8 個位元組
TIME 8 個位元組
TIMESTAMP 8 個位元組
STRUCT/RECORD 0 個位元組 + 所含欄位的大小
GEOGRAPHY 16 個位元組 + 24 個位元組 * 地理位置類型中的端點數 (您可以使用 ST_NumPoints 函式來確認端點數量)

所有資料類型的空值皆以 0 個位元組計算。

重複欄會以陣列的形式儲存,其資料量大小的計算依據為值的數量。舉例來說,重複 (ARRAY<INT64>) 且包含 4 個項目的整數資料欄 (INT64) 會計為 32 個位元組 (4 個項目 x 8 個位元組)。

串流資料的定價

將資料載入至 BigQuery 為免費服務,但您必須支付一筆小額的串流資料費用。

串流資料插入的價格如下:

資料操縱語言 (DML) 的定價

BigQuery 會根據查詢處理的資料量 (以位元組為單位) 來收取執行 DML 查詢作業的費用。

非分區資料表的 DML 定價

如果是非分區資料表,我們會根據以下方式來計算系統所處理的資料量:

DML 陳述式 處理的位元組數
INSERT 系統針對從查詢掃描的資料表參照的所有資料欄所處理的總位元組數。
UPDATE 從查詢掃描的資料表中參照的所有資料欄的總位元組數
+ UPDATE 開始執行時,已更新資料表中所有資料欄的總位元組數。
DELETE 從查詢掃描的資料表中參照的所有資料欄的總位元組數
+ DELETE 開始執行時,已修改資料表中所有資料欄的總位元組數。
MERGE 如果 MERGE 陳述式中只有 INSERT 子句,您必須支付以下費用:系統針對查詢掃描的所有資料表中參照的所有資料欄所處理的總位元組數。
如果 MERGE 陳述式中有 UPDATEDELETE 子句,您必須支付以下費用:系統針對查詢掃描的來源資料表中參照的所有資料欄所處理的總位元組數
+ MERGE 開始執行時,目標資料表中所有資料欄的總位元組數。

分區資料表的 DML 定價

如果是分區資料表,我們會根據以下方式來計算系統所處理的資料量:

DML 陳述式 處理的位元組數
INSERT 系統針對查詢掃描的所有分區中參照的所有資料欄中所處理的總位元組數。
UPDATE 系統針對查詢掃描的資料表的所有分區中參照的所有資料欄所處理的總位元組數
+ UPDATE 開始執行時,正在更新的資料表的已更新或已掃描分區中,所有資料欄的總位元組數。
DELETE 系統針對查詢掃描的資料表的所有分區中參照的所有資料欄所處理的總位元組數
+ DELETE 開始執行時,正在修改的資料表的已修改或已掃描分區中,所有資料欄的總位元組數。
MERGE 如果 MERGE 陳述式中只有 INSERT 子句,您必須支付以下費用:系統針對查詢掃描的所有分區中參照的所有資料欄所處理的總位元組數。
如果 MERGE 陳述式中有 UPDATEDELETE 子句,您必須支付以下費用:系統針對查詢掃描的來源資料表的所有分區中參照的所有資料欄所處理的總位元組數
+ MERGE 開始執行時,目標資料表所有已更新、刪除或掃描的分區中,所有資料欄的總位元組數。

資料定義語言的定價

BigQuery 會根據查詢處理的位元組數來收取執行 DDL 查詢作業的費用。處理的位元組數將會根據 DDL 陳述式來計算:

DDL 陳述式 處理的位元組數
CREATE TABLE 無。
CREATE TABLE ... AS SELECT ... 系統針對從查詢掃描的資料表參照的所有資料欄所處理的總位元組數。
CREATE VIEW 無。
DROP TABLE 無。
DROP VIEW 無。

叢集資料表的價格

在 BigQuery 中建立及使用叢集資料表時,系統會依據資料表中儲存的資料量,以及您對資料所執行的查詢來計算費用:叢集資料表會修剪資料,如此一來,查詢就不會處理修剪掉的資料,查詢成本也會因而降低。這個過程稱之為區塊修剪。

區塊修剪

BigQuery 根據叢集資料欄的值在叢集資料表中進行資料排序,並將資料組織成區塊。

如果您提交叢集資料欄含有篩選器的查詢,BigQuery 會使用叢集資訊有效確定區塊是否包含任何與查詢相關的資料,因而只掃描相關區塊,這樣的過程就稱為區塊修剪。

系統會根據已處理的位元組數來收取查詢費用。如果您對叢集資料表執行查詢,且查詢的叢集資料欄含有篩選器,則 BigQuery 會使用篩選器運算式及區塊中繼資料來修剪查詢所掃描的區塊。

系統不會掃描修剪掉的區塊,只有已掃描的區塊才會計入查詢處理的資料位元組數。查詢在叢集資料表中所處理的位元組數,等同於查詢在已掃描區塊中參照的每一個資料欄所讀取的總位元組數。

若使用多項篩選器的查詢多次參照某個叢集資料表,則 BigQuery 對各篩選器相應區塊內的資料欄所執行的掃描作業會產生費用。

指令碼的定價

在 BigQuery 指令碼 Beta 版上線期間,BigQuery 團隊建議使用保留固定費率的專案,以免產生非預期的查詢費用,因為系統通常無法確認指令碼在執行之前所掃描的位元組數。此外,您也可以使用 BigQuery 沙箱免費使用有限的指令碼執行功能。BigQuery 團隊將針對指定期間內指令碼掃描的總位元組數以及指令碼中的個別陳述式,提供更明確的控管功能。這是 Beta 版功能;如需定價的更新資訊,請參閱 BigQuery 版本資訊

如果指令碼失敗,陳述式啟動後直到失敗的期間仍會計費。失敗的陳述式則不會產生任何費用。

SELECTINSERTUPDATE 等已公開發布的陳述式類型,其執行費用已在公開價格說明文件中載明。如果是指令碼專屬的陳述式類型,則適用於下列價格:

  • DECLAREDEFAULT 運算式中參照的任何資料表所掃描的總位元組數。沒有資料表參照的 DECLARE 陳述式不會產生費用。
  • SET:運算式中參照的任何資料表所掃描的總位元組數。沒有資料表參照的 SET 陳述式不會產生費用。
  • IF:條件運算式中參照的任何資料表所掃描的總位元組數。沒有資料表參照的 IF 條件運算式不會產生費用。IF 區塊內任何未執行的陳述式也不會產生費用。
  • WHILE:條件運算式中參照的任何資料表所掃描的總位元組數。條件運算式中沒有資料表參照的 WHILE 陳述式不會產生費用。WHILE 區塊內任何未執行的陳述式也不會產生費用。
  • CONTINUEITERATE:沒有相關費用。
  • BREAKLEAVE:沒有相關費用。
  • BEGINEND:沒有相關費用。

指令碼執行時,臨時資料表不會產生儲存空間的費用。不過,如果有任何建立、修改或查詢資料表的陳述式,就適用於一般價格。

BigQuery 計費示例

估算查詢費用

如需查詢的計費示例,請參閱估算查詢費用一節。

估算儲存空間費用

如需儲存空間的計費示例,請參閱估算儲存空間費用

非分區資料表的 DML 計費示例

以下示例說明 BigQuery 如何計算修改非分區資料表的 DML 陳述式所讀取的位元組數。

示例 1:非分區資料表 (「UPDATE」)

table1 有兩個資料欄:一個為 INTEGER 類型的 col1,另一個為 STRING 類型的 col2

UPDATE table1 SET col1 = 1 WHERE col2 = 2;

此示例中處理的位元組數 =

  • col1 中的總位元組數 +
  • col2 中的總位元組數

示例 2:非分區資料表 (「UPDATE」)

table1 有 2 個資料欄:一個為 INTEGER 類型的 col1,另一個為 STRING 類型的 col2table2 則有 1 個資料欄:INTEGER 類型的 field1

UPDATE table1 SET col1 = 1 WHERE col1 in (SELECT field1 from table2)

此示例中處理的位元組數 =

  • UPDATE 之前 table1.col1 中的總位元組數 +
  • UPDATE 之前 table1.col2 中的總位元組數 +
  • table2.field1 中的總位元組數

分區資料表的 DML 計費示例

以下示例說明 BigQuery 如何計算修改分區資料表的 DML 陳述式讀取的位元組數。如要查看下列示例資料表的 JSON 結構定義表示法,請參閱「使用 DML 陳述式更新分區資料表資料」頁面上的示例中使用的資料表

示例 1:擷取時間分區資料表 (「INSERT」)

mytable2 有 2 個資料欄:一個為 INTEGER 類型的 id,另一個為 TIMESTAMP 類型的 tsmytable 有 2 個資料欄:一個為 INTEGER 類型的 field1,另一個為 STRING 類型的 field2

INSERT INTO mytable (_PARTITIONTIME, field1) AS SELECT TIMESTAMP(DATE(ts)), id from mytable2

此示例中處理的位元組數 =

  • mytable2.ts 中的總位元組數 +
  • mytable2.id 中的總位元組數

插入資料列的資料表大小 (mytable) 不會影響查詢費用。

示例 2:分區資料表 (「INSERT」)

mytable2 有 2 個資料欄:一個為 INTEGER 類型的 id,另一個為 TIMESTAMP 類型的 tsmycolumntable 有 4 個資料欄:類型 INTEGERfield1STRING 類型的 field2BOOLEAN 類型的 field3TIMESTAMP 類型的 ts

INSERT INTO mycolumntable (ts, field1) AS SELECT ts, id from mytable2

此示例中處理的位元組數 =

  • mytable2.ts 中的總位元組數 +
  • mytable2.id 中的總位元組數

插入資料列的資料表大小 (mycolumntable) 不會影響查詢費用。

示例 3:擷取時間分區資料表 (「UPDATE」)

DML 陳述式 1:更新單一分區

mytable2 有 2 個資料欄:一個為 INTEGER 類型的 id,另一個為 TIMESTAMP 類型的 tsmytable 有 2 個資料欄:一個為 INTEGER 類型的 field1,另一個為 STRING 類型的 field2

UPDATE project.mydataset.mytable T SET T.field1 = T.field1 + 100 WHERE T._PARTITIONTIME = TIMESTAMP(“2017-05-01”) AND EXISTS (SELECT S.id from project.mydataset.mytable2 S WHERE S.id = T.field1)

此示例中處理的位元組數 =

  • mytable2.id 中的總位元組數 +
  • 「2017-05-01」分區中 mytable.field1 的總位元組數 +
  • 「2017-05-01」分區中 mytable.field2 的總位元組數

DML 陳述式 2:根據資料表中的一個分區來更新另一個分區

UPDATE project.mydataset.mytable T SET T._PARTITIONTIME = TIMESTAMP(“2017-06-01”), T.field1 = T.field1 + 100 WHERE T._PARTITIONTIME = TIMESTAMP(“2017-05-01”) AND EXISTS (SELECT 1 from project.mydataset.mytable S WHERE S.field1 = T.field1 AND S._PARTITIONTIME = TIMESTAMP("2017-06-01") )

此示例中處理的位元組數 =

  • 「2017-05-01」分區中 mytable.field1 的總位元組數 +
  • 「2017-05-01」分區中 mytable.field2 的總位元組數 +
  • 「2017-06-01」分區中 mytable.field1 的總位元組數 +
  • 「2017-06-01」分區中 mytable.field2 的總位元組數

在這種情況下,「UPDATE」陳述式的費用為對應「2017-05-01」和「2017-06-01」的分區中所有欄位大小的總和。

示例 4:分區資料表 (「UPDATE」)

DML 陳述式 1:更新單一分區

mytable2 有 2 個資料欄:一個為 INTEGER 類型的 id,另一個為 TIMESTAMP 類型的 tsmycolumntable 有 4 個資料欄:類型 INTEGERfield1STRING 類型的 field2BOOLEAN 類型的 field3TIMESTAMP 類型的 ts

UPDATE project.mydataset.mycolumntable T SET T.field1 = T.field1 + 100 WHERE DATE(T.ts) = “2017-05-01” AND EXISTS (SELECT S.id from project.mydataset.mytable2 S WHERE S.id = T.field1)

此示例中處理的位元組數 =

  • mytable2.id 中的總位元組數 +
  • 「2017-05-01」分區中 mycolumntable.field1 的總位元組數 +
  • 「2017-05-01」分區中 mycolumntable.field2 的總位元組數 +
  • 「2017-05-01」分區中 mycolumntable.field3 的總位元組數 +
  • 「2017-05-01」分區中 mycolumntable.ts 的總位元組數

DML 陳述式 2:根據資料表中的一個分區來更新另一個分區

UPDATE project.mydataset.mycolumntable T SET T.ts = TIMESTAMP(“2017-06-01”), T.field1 = T.field1 + 100 WHERE DATE(T.ts) = “2017-05-01” AND EXISTS (SELECT 1 from project.mydataset.mycolumntable S WHERE S.field1 = T.field1 AND DATE(S.ts) = "2017-06-01")

此示例中處理的位元組數 =

  • 「2017-05-01」分區中 mycolumntable.field1 的總位元組數 +
  • 「2017-05-01」分區中 mycolumntable.field2 的總位元組數 +
  • 「2017-05-01」分區中 mycolumntable.field3 的總位元組數 +
  • 「2017-05-01」分區中 mycolumntable.ts 的總位元組數 +
  • 「2017-06-01」分區中 mycolumntable.field1 的總位元組數 +
  • 「2017-06-01」分區中 mycolumntable.field2 的總位元組數 +
  • 「2017-06-01」分區中 mycolumntable.field3 的總位元組數 +
  • 「2017-06-01」分區中 mycolumntable.ts 的總位元組數

在這種情況下,「UPDATE」陳述式的費用為對應「2017-05-01」和「2017-06-01」的分區中所有欄位大小的總和。

示例 5:擷取時間分區資料表 (「DELETE」)

mytable2 有 2 個資料欄:一個為 INTEGER 類型的 id,另一個為 TIMESTAMP 類型的 tsmytable 有 2 個資料欄:一個為 INTEGER 類型的 field1,另一個為 STRING 類型的 field2

DELETE project.mydataset.mytable T WHERE T._PARTITIONTIME = TIMESTAMP(“2017-05-01”) AND EXISTS (SELECT S.id from project.mydataset.mytable2 S WHERE S.id = T.field1)

此示例中處理的位元組數 =

  • mytable2.id 中的總位元組數 +
  • 「2017-05-01」分區中 mytable.field1 的總位元組數 +
  • 「2017-05-01」分區中 mytable.field2 的總位元組數

示例 6:分區資料表 (「DELETE」)

mytable2 有 2 個資料欄:一個為 INTEGER 類型的 id,另一個為 TIMESTAMP 類型的 tsmycolumntable 有 4 個資料欄:類型 INTEGERfield1STRING 類型的 field2BOOLEAN 類型的 field3TIMESTAMP 類型的 ts

DELETE project.mydataset.mycolumntable T WHERE DATE(T.ts) =“2017-05-01” AND EXISTS (SELECT S.id from project.mydataset.mytable2 S WHERE S.id = T.field1)

此示例中處理的位元組數 =

  • mytable2.id 中的總位元組數 +
  • 「2017-05-01」分區中 mycolumntable.field1 的總位元組數 +
  • 「2017-05-01」分區中 mycolumntable.field2 的總位元組數 +
  • 「2017-05-01」分區中 mycolumntable.field3 的總位元組數 +
  • 「2017-05-01」分區中 mycolumntable.ts 的總位元組數

叢集資料表的計費示例

您有一個名為 ClusteredSalesData 的叢集資料表。資料表會依 timestamp 資料欄進行分區,並由 customer_id 資料欄建為叢集。資料會按以下這組區塊分類:

分區 ID 區塊 ID 區塊中 customer_id 的下限 區塊中 customer_id 的上限
20160501 B1 10000 19999
20160501 B2 20000 24999
20160502 B3 15000 17999
20160501 B4 22000 27999

您對該資料表進行以下的查詢。查詢包含了 customer_id 資料欄的篩選器。

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  customer_id BETWEEN 20000
  AND 23000
  AND DATE(timestamp) = "2016-05-01"

這項查詢會進行下列操作:

  • 掃描 B2 和 B4 區塊中 timestampcustomer_idtotalSale 資料欄。
  • DATE(timestamp) = "2016-05-01" 篩選器述語針對 timestamp 分區資料欄,因此修剪 B3 區塊。
  • customer_id BETWEEN 20000 AND 23000 篩選器述語針對 customer_id 叢集資料欄,因此修剪 B1 區塊。

指令碼計費示例

在以下的示例指令碼中,每個陳述式的上方都提供註解,說明各個陳述式會產生的費用 (如有的話)。

-- No cost, since no tables are referenced.
DECLARE x DATE DEFAULT CURRENT_DATE();
-- Incurs the cost of scanning string_col from dataset.table.
DECLARE y STRING DEFAULT (SELECT MAX(string_col) FROM dataset.table);
-- Incurs the cost of copying the data from dataset.big_table.  Once the
-- table is created, you are not charged for storage while the rest of the
-- script runs.
CREATE TEMP TABLE t AS SELECT * FROM dataset.big_table;
-- Incurs the cost of scanning column1 from temporary table t.
SELECT column1 FROM t;
-- No cost, since y = 'foo' doesn't reference a table.
IF y = 'foo' THEN
  -- Incurs the cost of scanning all columns from dataset.other_table, if
  -- y was equal to 'foo', or otherwise no cost since it is not executed.
  SELECT * FROM dataset.other_table;
ELSE
  -- Incurs the cost of scanning all columns from dataset.different_table, if
  -- y was not equal to 'foo', or otherwise no cost since it is not executed.
  UPDATE dataset.different_table
  SET col = 10
  WHERE true;
END IF;
-- Incurs the cost of scanning date_col from dataset.table for each
-- iteration of the loop.
WHILE x < (SELECT MIN(date_col) FROM dataset.table) DO
  -- No cost, since the expression does not reference any tables.
  SET x = DATE_ADD(x, INTERVAL 1 DAY);
  -- No cost, since the expression does not reference any tables.
  IF true THEN
    -- LEAVE has no associated cost.
    LEAVE;
  END IF;
  -- Never executed, since the IF branch is always taken, so does not incur
  -- a cost.
  SELECT * FROM dataset.big_table;
END WHILE;