BigQuery 定價

如要瞭解 BigQuery 的價格資訊,請參閱本頁面。

如果是 BigQuery ML,請參閱 BigQuery ML 定價頁面。

如果是 BigQuery 資料移轉服務,請參閱 BigQuery 資料移轉服務定價頁面。

總覽

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

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

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

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

  • 以量計價:這是最具彈性的選項。以量計價的價格取決於您執行的每個查詢所處理的資料量。
  • 固定費率:這個計價選項提供可預測的費用金額,最適合預算固定的客戶。採用固定費率的客戶可購買查詢處理作業的專屬資源,且不必支付個別查詢的費用。

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

計價方式摘要

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

計費方式

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

如何解讀帳單資料

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

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

免費作業項目

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

作業項目 說明
載入資料

從 Cloud Storage 將資料載入至 BigQuery 時,您不必支付載入作業的費用,但必須支付在 Cloud Storage 中儲存資料的費用。詳情請參閱 Cloud Storage 定價頁面上的資料儲存一節。資料載入至 BigQuery 後,將適用 BigQuery 的儲存空間定價。詳情請參閱將資料載入至 BigQuery 一文。

在 BigQuery 中建立資料集時,您必須為資料選擇儲存位置。如果您選擇 US,就能從任何其他地區的 Cloud Storage 值區將資料載入至資料集中的資料表。另外,從其他地區將資料載入至 US 資料集時,您目前不必支付任何網際網路輸出費用。

如果您是選擇 US 以外的位置,則必須執行下列其中一項操作:

  • 從該地區的 Cloud Storage 值區中載入資料 (值區可以是多地區值區,也可以是與資料集位於同一地區的單一地區值區)
  • 將資料複製到該地區的值區

當您將資料從一個 Cloud Storage 地區複製到另一個 Cloud Storage 地區時,將適用 Cloud Storage 的網路定價

複製資料 複製資料表不必付費,但儲存新的資料表和您所複製的資料表必須付費。詳情請參閱複製現有資料表一節。
匯出資料 從 BigQuery 將資料匯出至 Cloud Storage 時,您不必支付匯出作業的費用,但必須支付在 Cloud Storage 中儲存資料的費用。詳情請參閱 Cloud Storage 定價頁面上的資料儲存一節,以及從 BigQuery 匯出資料一文。
刪除資料集 刪除資料集無須付費。
刪除資料表、檢視表、分區和函式 刪除資料表、檢視表、個別資料表分區或使用者定義函式都不必付費。
中繼資料作業 您不必支付 list、get、patch、update 和 delete 的呼叫費用,其中包含但不限於以下項目:列出資料集、更新資料集的存取控制清單、更新資料表的說明,或是列出資料集內的使用者定義函式。
讀取虛擬資料欄 查詢下列虛擬資料欄的內容無須付費:
_TABLE_SUFFIX:在查詢萬用字元資料表時,或是在標準 SQL 資料表中達到修飾符語意時使用 _PARTITIONDATE:在查詢擷取時間分區資料表時使用 _PARTITIONTIME:在查詢擷取時間分區資料表時使用 _FILE_NAME:在查詢以外部資料來源為基礎的資料表時使用
讀取中繼資料表 查詢下列中繼資料表的內容無須付費:
__PARTITIONS_SUMMARY__:在取得分區資料表或擷取時間分區資料表中的分區相關中繼資料時使用 __TABLES_SUMMARY__:在取得資料集中的資料表和資料檢視相關中繼資料時使用
建立、替換或呼叫 UDF 目前,建立、替換或叫用永久的使用者定義函式 (UDF) 不必付費。永久的 UDF 目前為 Beta 版,定價隨時可能會變動。

永久免費的用量限制

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 查詢。

查詢的定價

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

BigQuery 提供兩種計費模式:

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

根據預設,系統會按照以量計價的模式向您收取費用。您可以選擇符合自身需求的計費模式。您也可以針對不同的專案與位置,自由搭配這兩種計費模式。

以量計價

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

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

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

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

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

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

查詢 Cloud Storage 資料

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

在 Cloud Storage 上查詢資料欄式的格式

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

在 Cloud Storage 中儲存外部分區資料的價格

查詢儲存在 Cloud Storage 中的 Hive 分區資料表會產生額外費用。

BigQuery 會計算未縮減檔案名稱長度的總位元組數。Hive 分區的整體費用會四捨五入至最接近的 MB 數,而查詢作業中每個 Hive 分區資料表處理的資料量基本額度為 10 MB。

固定費率

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

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

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

固定費率計價方式:

  • 適用於查詢費用,包括 BigQuery ML、DML 和 DDL 陳述式。
  • 不適用於儲存空間串流擷取或 BI Engine 費用。
  • 僅適用於地區性資源的購買。在特定地區購買的運算單元使用承諾無法用於其他地區,也無法遷移。
  • 允許客戶聯絡 Google Cloud Platform 支援小組來提高每項專案的並行配額。
  • 提供月約方案和年約方案。
  • 可與整個機構共享。您不需為每項專案購買運算單元使用承諾

每月固定費率的使用承諾

註冊固定費率的計價方案時,您必須購買運算單元使用承諾,而系統會以 BigQuery 運算單元為單位進行計算。運算單元使用承諾從 500 個運算單元起算。在承諾期間,系統會以秒計費。下表列出運算單元使用承諾的月約方案費用。

每年固定費率的使用承諾

註冊固定費率的計價方案時,您必須購買運算單元使用承諾,而系統會以 BigQuery 運算單元為單位進行計算。運算單元使用承諾從 500 個運算單元起算。下表列出運算單元使用承諾的年約方案費用。當您註冊年約方案後,系統在承諾期間會以秒計費。

儲存空間定價

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

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

動態儲存

動態儲存的價格如下:

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

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

長期儲存

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

長期儲存的價格如下:

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

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

其他作業均「不會」導致系統重設計時器,這些作業包括:

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

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

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

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

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 個位元組,也就是 1024 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 陳述式 處理的位元組數
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 陳述式 處理的位元組數
CREATE TABLE 無。
CREATE TABLE ... AS SELECT ... 從查詢掃描的資料表中參照的所有資料欄所處理的總位元組數。
CREATE VIEW 無。
DROP TABLE 無。
DROP VIEW 無。

叢集資料表的價格

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

區塊修剪

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

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

查詢會基於已處理的位元組數量來收費。若您對叢集資料表執行查詢,且查詢的叢集資料欄含有篩選器,則 BigQuery 會使用篩選器表達式及區塊中繼資料來修剪查詢所掃描的區塊。

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

若叢集資料表在有使用篩選器的查詢中被參照好幾次,BigQuery 會對每個篩選器對應之區塊中,所掃描的資料欄進行收費。

指令碼的定價

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

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

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

  • DECLARE:DEFAULT 運算式中參照的任何資料表所掃描的總位元組數。沒有資料表參照的 DECLARE 陳述式不會產生費用。
  • SET:運算式中參照的任何資料表所掃描的總位元組數。沒有資料表參照的 SET 陳述式不會產生費用。
  • IF:條件運算式中參照的任何資料表所掃描的總位元組數。沒有資料表參照的 IF 條件運算式不會產生費用。IF 區塊內的任何未執行的陳述式亦不會產生費用。
  • WHILE:條件運算式中參照的任何資料表所掃描的總位元組數。條件運算式中沒有資料表參照的 WHILE 陳述式不會產生費用。WHILE 區塊內的任何未執行的陳述式亦不會產生費用。
  • CONTINUE/ITERATE:沒有相關費用。
  • BREAK/LEAVE:沒有相關費用。
  • BEGIN/END:沒有相關費用。

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

BigQuery 計費範例

估算查詢費用

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

估算儲存空間費用

如需儲存空間的計費範例,請參閱估算儲存空間費用一節。

非分區資料表的資料操縱語言計費範例

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

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

table1 有 2 個資料欄:一個為 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 中的總位元組數

分區資料表的資料操縱語言計費範例

以下範例說明 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 B1 15000 17999
20160501 B4 22000 2799

您對該資料表進行以下的查詢。查詢包含了 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;