本文概述了分區表模塊的主要實現原理,便于用戶了解分區表在底層實現時的一些細節,從而能夠更好地學習如何去使用分區表。
分區表創建原理
分區表的創建主要涉及語法解析模塊和執行模塊。
語法解析模塊
分區表創建是分區表整個功能的核心部分,任何分區表都需要經過一個完整的語法樹創建出來,這個語法樹上包含了諸多分區表的特性,如下圖所示。
其中主要的關鍵字包括:
PARTITION BY
:指定一級分區的類型和字段。SUBPARTITION BY
:指定二級分區的類型和字段。INTERVAL
:指定自動間隔分區的屬性。SUBPARTITION TEMPLATE
:子分區模板的屬性。(PARTITION xxx)
: 子分區列表。
接收到用戶的輸入后,第一步是將語法樹轉換為數據庫中的Node節點。下圖詳細解釋了這個轉換的過程。
整個語法樹掛在了
CreateStmt
節點下,分區表本質上還是創建一張表的過程;partspec
節點是一級分區管理節點,它承載了分區鍵和分區策略;PartitionInfo
節點是二級的管理節點,承載了大部分語法樹上的結構。根據顏色我們可以大致將其分為如下幾個模塊,后續由這些模塊的結合來完成分區創建過程:Interval分區模塊
一級分區模塊
二級子分區模塊
分區模板模塊
二級節點列表模塊
語法執行模塊
執行器根據步驟大致分為以下三個部分。
轉儲表定義存儲模塊
第一步是轉儲表定義存儲模塊。該模塊將未來創建子表可能的模板信息轉儲到表定義中去,為了能夠在表之后的使用中保留元信息。
將表定義存儲到表的Option結構上,包括這些數據需要存儲:
interval_expr:這個結構存儲間隔分區的間隔大小。
sub_part_strategy/sub_part_params:存儲二級分區的分區鍵和分區類型信息。
partition_template_list:存儲了模板分區列表,用于后續的子分區模塊分區的創建。
sub_hash_number:存儲了模板分區的HASH數量,用于后續構建出正確的HASH分區。
子表定義模塊
第二步為子表定義模塊。將創建信息切換成實際的創建列表。
將抽象的HASH分區/模塊分區生成實際的節點樹,用于創建后續的分區。
說明對于一級分區表,通過hash_number生成partition_node_list,該列表實際會創建HASH分區表。
對于二級分區表,通過template_list生成partition_node_list, 如果用戶定義了分區模板,需要生成該列表。
遍歷生成的partition_node_list,補充分區策略、分區鍵等分區表的關鍵信息。
如果判斷出sub_hash_number或者template_list不為空,說明節點還記錄了二級分區的屬性。需要將二級分區的這些屬性填入一級分區(或者生成的一級分區中),后續等待二級分區創建時遞歸處理。
實際創建模塊
第三步為實際創建模塊。將節點列表轉換成創建列表。
將之前用來代表子節點的PartitionRelNode節點轉換成CreateStmt節點,然后進行創建操作。
分區表管理原理
分區表管理是分區表另一個核心的組成部分,相比于普通表,分區表有更豐富的管理方式。
分區表的管理可以分為以下10個主要模塊:
MODIFY:管理分區,是一類操作的集合,對象是一個一級分區,可以通過該指令管理這個分區下的二級分區。
MOVE:移動分區,通常是移動其存儲位置。
ADD:增加分區,為分區表增加一個一級分區。
COLESCE:裁剪分區,只用于HASH分區,該命令使得HASH分區的數量減一。
DROP:刪除分區,可以指定刪除掉一個RANGE/LIST分區。
RENAME:為分區重命名。
TRUNCATE:重整分區,將整個分區清空。
SPLIT:拆分分區,用于RANGE/LIST分區,將一個分區拆分為兩個分區,可以指定一個分區屆作為拆分的界限。
MERGE:歸并分區,用于RANGE/LIST分區,將兩個分區歸并為一個分區。
EXCHANGE:交換分區,交換兩個分區的內容,需要通過分區的界限檢查。