ClickHouse(10)ClickHouse合併樹MergeTree家族表引擎之ReplacingMergeTree詳細解析

2022-11-09 21:00:44

MergeTree擁有主鍵,但是它的主鍵卻沒有唯一鍵的約束。這意味著即便多行資料的主鍵相同,它們還是能夠被正常寫入。在某些使用場合,使用者並不希望資料表中含有重複的資料。ReplacingMergeTree就是在這種背景下為了資料去重而設計的,它能夠在合併分割區時刪除重複的資料。但是ReplacingMergeTree並不一定保證不會出現重複的資料。

ReplacingMergeTree是另外一個常用的表引擎,ReplacingMergeTree和MergeTree的不同之處在於它會刪除排序鍵值相同的重複項。

資料的去重只會在資料合併期間進行。合併會在後臺一個不確定的時間進行,因此你無法預先作出計劃。有一些資料可能仍未被處理。可以呼叫OPTIMIZE語句發起計劃外的合併,但儘量不要依靠它,因為OPTIMIZE語句會引發對資料的大量讀寫。

因此,ReplacingMergeTree適用於在後臺清除重複的資料以節省空間,但是它不保證沒有重複的資料出現。

建表語法

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = ReplacingMergeTree([ver])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

建立ReplacingMergeTree表的引數中,與MergeTree不同的是[ver]。ver(版本列)。類可以型為UInt*,Date或DateTime。這個屬於可選引數,所以你也可以不用指定。

在資料合併的時候,ReplacingMergeTree 從所有具有相同排序鍵的行中選擇一行留下:如果ver列未指定,保留最後一條。如果ver列已指定,保留ver值最大的版本。

其他的與MergeTree表是一致,它屬於MergeTree表的的一個變種。

MergeTree表引擎的解析可以參考ClickHouse(09)ClickHouse合併樹MergeTree家族表引擎之MergeTree詳細解析

資料處理策略

最後總結一下ReplacingMergeTree引擎的資料處理策略,主要是下面五個點。

  1. 使用ORBER BY排序鍵作為判斷重複資料的唯一鍵。
  2. 只有在合併分割區的時候才會觸發刪除重複資料的邏輯。
  3. 以資料分割區為單位刪除重複資料。當分割區合併時,同一分割區內的重複資料會被刪除;不同分割區之間的重複資料不會被刪除。
  4. 在進行資料去重時,因為分割區內的資料已經基於ORBER BY進行了排序,所以能夠找到那些相鄰的重複資料。
  5. 在資料合併的時候,ReplacingMergeTree 從所有具有相同排序鍵的行中選擇一行留下:如果ver列未指定,保留最後一條。如果ver列已指定,保留ver值最大的版本。

資料分享

ClickHouse經典中文檔案分享

參考文章