Photo by Markus Winkler / Unsplash

[BigQuery] 如何建立分區資料表 (partitioned tables)

BigQuery Sep 5, 2023
快速導覽

一、什麼是分區資料表?

BigQuery分區資料表是一種在Google Cloud Platform的BigQuery中,將資料表根據特定欄位分割成多個部分的方法,以提高查詢效能和數據管理的效率。像是下圖依照Order_Date欄位將資料表分區。

依照Order_Date欄位將資料表分區

二、為什麼需要將資料表分區?

隨著業務拓展及時間的累積,BigQuery儲存的資料量越來越多,查詢所需要的花費及時間也會越來越多,儘管在查詢時用WHERE去過濾資料,運算時還是會掃描整張表,花費並不會因此而減少,這時候就需要將資料表進行分區,資料表被分區後能有以下幾個優點:

1. 提高查詢效率

當數據表變得非常多時,執行查詢可能需要大量的時間。分區資料表將數據分成更小的部分,能夠僅查詢感興趣的特定分區數據,可以顯著提高查詢的效率。例如,可以根據日期分區數據,這樣可以只查詢特定日期範圍內的數據。

2. 節省成本

在查詢時,只針對需要的分區資料表進行查詢,可以讓查詢量限縮在選擇的這些分區下。例如,以日期分區的資料表,只查詢特定日期範圍內的數據時,就只會掃描該日期範圍區間內的資料。也可以強制使用資料表的使用者,在進行查詢時,必定要先使用分區欄位進行過濾,避免掃描整張資料表。

3. 方便管理

分區資料表使數據管理變得更容易。需要添加、刪除或維護數據時,只需處理特定分區,而不會影響整個表。這對於定期更新或刪除過時數據非常有用。也可以設定分區有效期限,讓過期的分區自動刪除。

三、建立分區資料表

1. 以整數範圍分區

使用特定整數(INTEGER)欄位對資料表進行分區。使用整數欄位分區時,需要提供:

開始 (Start):範圍分區的起始值。起始值也包含在範圍內。

結尾 (End):範圍分區的結尾值。結尾值不包含在範圍內。

時間間隔 (Interval):範圍分區的間隔值。間隔值必須是正整數。

使用整數欄位分區的設定畫面

2. 以時間欄位分區

可以使用DATE、TIMESTAMP、DATETIME格式欄位對資料表進行分區(備註:TIME格式欄位無法用來分區),當資料寫入資料表時,BigQuery會自動將資料放入正確的分區中。TIMESTAMP、DATETIME可以選擇使用年、月、日、時為顆粒度來分區,DATE只能選擇日為顆粒度。

使用TIMESTAMP欄位分區的設定畫面


使用DATETAMP欄位分區的設定畫面


使用DATE欄位分區的設定畫面


3. 以資料匯入時間分區

如果資料表中,沒有任何的時間欄位,也沒有適合的整數欄位來作為分區,可以使用資料匯入時間來當作分區的依據,在分區的下拉選單選擇"依擷取時間分區",顆粒度可以選擇使用年、月、日、時。建立使用匯入

資料時間來分區的資料表時,BigQuery會使用虛擬欄位 (pseudocolumn) 名為_PARTITIONTIME的欄位來儲存資料匯入時間,此欄位不會顯示在結構定義 (SCHEMA) 的頁面中。

使用資料匯入時間分區的設定畫面


使用資料匯入時間分區的可調整顆粒度


BigQuery會使用虛擬欄位_PARTITIONTIME來分區

_PARTITIONTIME欄位不會顯示在結構定義 (SCHEMA) 的頁面中

四、NULL值與範圍外的值如何分區

建立分區資料表時,系統會自動創建兩個特殊分區:

__NULL__:儲存分區欄位中值為NULL的資料。

__UNPARTITIONED__:若以整數欄位分區,儲存整數超過設定範圍值的資料列。若以時間欄位分區,儲存時間早於1960-01-01或時間晚於2159-12-31的資料列。

五、設定分區有效期限

前面有提到,設定分區有效期限,可以讓過期的分區自動刪除。在創建資料表的介面無法直接設定,可以使用以下語法來變更資料表設定。以下語法會將分區有效期限設定為5天,在5天前分區的資料將被自動刪除。

ALTER TABLE mydataset.mytable
  SET OPTIONS (
    -- Sets partition expiration to 5 days
    partition_expiration_days = 5);


分區有效期限被設定為5天


Tags