叢集資料表簡介

BigQuery 中的叢集資料表是指使用叢集欄的資料表,這些資料表具有使用者定義的資料欄排序順序。叢集資料表可提升查詢效能並降低查詢費用。

在 BigQuery 中,叢集資料欄是使用者定義的資料表屬性,可根據叢集資料欄中的值排序儲存區塊。儲存空間區塊的大小會根據資料表的大小進行調整。並置發生在儲存空間區塊層級,而非個別資料列層級;如要進一步瞭解在此情況下的並置,請參閱「叢集」。

在每個修改資料表的作業中,叢集資料表都會保留其排序屬性。依叢集化資料欄篩選或匯總的查詢,只會根據叢集化資料欄掃描相關區塊,而不會掃描整個資料表或資料表分區。因此,BigQuery 可能無法準確預估查詢處理的位元組數或查詢費用,但會嘗試在執行時減少總位元組數。

使用多個資料欄對資料表進行叢集處理時,資料欄順序會決定 BigQuery 排序及將資料分組至儲存區塊時,哪些資料欄優先使用,如以下範例所示。表 1 顯示未經叢集的資料表邏輯儲存區塊版面配置。比較之下,表格 2 只會依 Country 欄進行叢集,而表格 3 則會依多個欄 (CountryStatus) 進行叢集。

BigQuery 會排序叢集資料表中的資料,以改善查詢效能。

查詢叢集表格時,您不會在查詢執行前收到準確的查詢費用預估值,因為在查詢執行前,系統無法得知要掃描的儲存空間區塊數量。最終費用會在查詢執行完畢後決定,並根據掃描到的特定儲存空間區塊計算。

使用叢集處理的時機

叢集處理可解決資料表的儲存方式問題,因此通常是改善查詢效能的首選。因此,您應考量集群運作帶來的下列優勢:

  • 未分割的資料表大小若超過 64 MB,很可能會因叢集而受益。同樣地,超過 64 MB 的資料表分區也可能會從叢集處理中受益。您可以將較小的資料表或分區分群,但效能提升幅度通常不明顯。
  • 如果您的查詢通常會篩選特定資料欄,叢集處理功能就會加快查詢速度,因為查詢只會掃描與篩選條件相符的區塊。
  • 如果查詢篩選的資料欄含有許多不重複值 (高卡氏度),叢集功能會為 BigQuery 提供詳細的中繼資料,說明要從何處取得輸入資料,藉此加快這些查詢的速度。
  • 叢集處理可讓資料表的基礎儲存空間區塊根據資料表大小,自動調整大小。

除了叢集處理之外,您可能還想考慮分割資料表。在這種方法中,您會先將資料分割為分區,然後再根據叢集處理資料欄,將每個分區中的資料分群。在下列情況下,建議您採用這種做法:

  • 您必須先嚴格估算查詢費用,才能執行查詢。只有在查詢執行後,才能判斷叢集資料表的查詢成本。分區功能可在執行查詢前提供詳細的查詢費用預估值。
  • 分割資料表後,每個分區的平均分區大小至少為 10 GB。建立許多小分區會增加資料表的中繼資料,並可能影響查詢資料表時的中繼資料存取時間。
  • 您需要持續更新資料表,但仍想發揮長期儲存價格的效益。分區功能可讓系統分別考量每個分區是否符合長期價格的資格。如果資料表未分區,則整個資料表必須連續 90 天未經編輯,才能採用長期儲存價格。

詳情請參閱「結合叢集和分區資料表」。

叢集欄類型和排序

本節將說明資料欄類型,以及資料欄順序在表格叢集中的運作方式。

叢集欄位類型

叢集資料欄必須是頂層的非重複資料欄,且屬於下列任一類型:

  • BIGNUMERIC
  • BOOL
  • DATE
  • DATETIME
  • GEOGRAPHY
  • INT64
  • NUMERIC
  • RANGE
  • STRING
  • TIMESTAMP

如要進一步瞭解資料類型,請參閱「GoogleSQL 資料類型」一文。

叢集資料欄排序

叢集資料欄的順序會影響查詢效能。在下列範例中,系統會使用 Order_DateCountryStatus 的資料欄排序順序,為 Orders 資料表建立叢集。本例中的第一個叢集資料欄是 Order_Date,因此篩選 Order_DateCountry 的查詢會針對叢集進行最佳化,而篩選 CountryStatus 的查詢則不會進行最佳化。

叢集資料表的查詢必須依序納入叢集欄,從第一個欄開始。

區塊修剪

叢集資料表會修剪資料,如此一來,查詢就不會處理修剪掉的資料,查詢成本也會因而降低。這個過程稱為區塊修剪。BigQuery 根據叢集資料欄的值在叢集資料表中進行資料排序,並將資料組織成區塊。

如果您對叢集資料表執行查詢,且查詢的叢集資料欄含有篩選器,則 BigQuery 會使用篩選器運算式及區塊中繼資料來修剪查詢所掃描的區塊。這樣一來,BigQuery 就只會掃描相關區塊。

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

如果叢集資料表在使用多項篩選器的查詢中被參照好幾次,BigQuery 會對每個篩選器對應的區塊中,掃描的資料欄進行收費。如要瞭解區塊裁剪的運作方式,請參閱範例

結合分群和分區資料表

您可以將資料表叢集處理與資料表分區結合,以便進一步最佳化查詢,並獲得精細的排序結果。

在分區資料表中,資料會儲存在實際區塊中,每個區塊都會保留一個資料分區。每個分區資料表都會在所有修改排序屬性的作業中,保留排序屬性的各種中繼資料。中繼資料可讓 BigQuery 在執行查詢前,更準確地估算查詢費用。不過,比起未分區資料表,分區資料表需要 BigQuery 維護更多中繼資料。隨著分區數量的增加,需要維護的中繼資料量也會增加。

建立經過叢集和分區處理的資料表時,您可以獲得更精細的排序結果,如下圖所示:

比較未叢集或分區的資料表,以及已叢集和分區的資料表。

範例

您有一個名為 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 區塊。

自動重新分群

隨著資料新增到叢集資料表中,新資料會分成區塊,這些區塊可能會建立新的儲存區塊或更新現有區塊。如要獲得最佳查詢和儲存效能,就必須進行區塊最佳化,因為新資料可能不會與具有相同叢集值的現有資料分組。

為了維護叢集資料表的效能特性,BigQuery 會在背景中執行自動重新進行叢集處理。對於分區資料表,系統會以每個分區為範圍維持資料的叢集處理。

限制

  • 只能透過 GoogleSQL 查詢叢集資料表,以及將查詢結果寫入叢集資料表。
  • 您最多可指定四個叢集資料欄,如果需要其他資料欄,建議您將叢集與區隔功能結合使用。
  • 使用 STRING 類型資料欄建立叢集時,BigQuery 只會使用前 1,024 個字元來建立資料叢集。資料欄中的值本身長度可超過 1,024 個半形字元。
  • 如果您將現有的非叢集資料表變更為叢集資料表,系統不會自動將現有資料叢集。只有使用叢集資料欄儲存的新資料才會自動重新分群。如要進一步瞭解如何使用 UPDATE 陳述式重新叢集現有資料,請參閱「修改叢集規格」。

叢集資料表的配額和限制

BigQuery 會透過配額和限制限制共用 Google Cloud 資源的使用情形,包括對特定資料表作業或一天內執行的工作數量設定限制。

在分區資料表中使用叢集資料表功能時,請遵守分區資料表的限制

配額和限制也適用於各種可以在叢集資料表執行的工作。如要瞭解適用於資料表的工作配額,請參閱「配額與限制」中的「工作」

叢集資料表定價

在 BigQuery 中建立及使用叢集資料表時,系統會依據資料表中儲存的資料量,以及您對資料執行的查詢來計算費用。詳情請參閱「儲存空間定價」和「查詢的定價」。

與其他 BigQuery 資料表作業一樣,叢集資料表作業會利用 BigQuery 免費作業,例如批次載入、資料表複製、自動重新叢集和資料匯出。這些作業適用 BigQuery 配額與限制。如需免費作業的相關資訊,請參閱「免費作業」。

如需叢集資料表的詳細定價範例,請參閱「估算儲存空間和查詢費用」。

表格安全性

如要控管 BigQuery 中資料表的存取權,請參閱「使用 IAM 控管資源存取權」。

後續步驟