type
status
date
slug
summary
tags
category
icon
password
MergeTree 表引擎
  1. Sparse Primary Index
  1. Partition
  1. Data Replication
  1. Data Sampling
notion image

分支

Replacing MergeTree

特色:在 merge 時會刪除具有相同 sorting key 的資料。
注意事項:
  • 重複的判斷是依照 ORDER BY 而不是 Primary key
  • 因為只有在 merge 時會觸發,因此不保證任何時刻都沒有重複資料。
  • 因為只有在 merge 時會觸發,因此不同 partition 的資料不會去重。
缺點:
  • 想要得到正確的結果只能透過 FINAL 修飾符,或者手動執行 OPTIMIZE 來讓 TABLE 觸發 Merge,不論哪一種都是昂貴的操作。
以下為建立一個 ReplacingMergeTree 的語法:
相關參數:
  • ver - 帶有版本號的欄位,允許 UInt*、Date、DateTime、DateTime64 的欄位,可選參數。
若未指定 ver 在 merge 時,同樣 sorting key 的資料會保留最後插入的一筆。
當指定 ver 在 merge 時,同樣 sorting key 的資料會保留 ver 指定的欄位最高的一筆,如果相同則同樣是保留最後插入的一筆。

範例

Summing MergeTree

特色:在 merge 時有相同 sorting key 的資料會進行合併,並依設定將指定或全部的數值欄位進行相加,非彙總的欄位則只會保留最早插入的數據。
注意事項:
  • 判斷是依照 ORDER BY 而不是 Primary key
  • 因為只有在 merge 時會觸發,因此不保證任何時刻資料都已彙整完畢,因此建議查詢時仍舊顯示指定 SUM()、GROUP BY。
  • 因為只有在 merge 時觸發,因此不同 partition 的資料不會合併。
以下為建立一個 SummingMergeTree 的語法:
相關參數:
  • columns - 指定要彙總的欄位名稱,所選的欄位必須為數值型態,並且不可在 ORDER BY 中。為可選的參數,如果未指定則會加總所有的非 ORDER BY 的數值型態欄位。
    • 非彙總的欄位只會保留最早插入的數據。

範例

Aggregating MergeTree

特色:在 merge 時有相同 sorting key 的資料會進行合併,並按照預先定義的條件聚合資料。
注意事項:
  • 判斷是依照 ORDER BY 而不是 Primary key
  • 因為只有在 merge 時會觸發,因此不保證任何時刻資料都已彙整完畢,因此建議查詢時仍舊顯示指定 SUM()、GROUP BY。
  • 因為只有在 merge 時觸發,因此不同 partition 的資料不會合併。
以下為建立一個 AggregatingMergeTree 的語法:

範例

Collapsing MergeTree

包含 collapsing(摺疊) 邏輯的 MergeTree,這在 merge 時會將 sorting key 相同的資料依照摺疊算法將數據折疊,以此減少資料量提升後續的查詢效率。
以下為建立一個 CollapsingMergeTree
相關參數:
  • sign - 型態為 Int8,用來表示該 row 的狀態:
    • 1:表示該 row ,稱其為 state row。
    • -1:表示該 row ,稱其為 cancel row。

摺疊算法

當 CH 合併數據時,會將具有相同 sorting key 的行減少到不超過 2 行,一個 state 一個 cancle,具體如何保留如下:
  • 如果 state = cancel 且最後一行是 state,則保留第一筆 cancel 和最後一筆 state 行。
  • 如果 state > cancel ,則只保留最後一個 state 行。
  • 如果 state < cancel ,則只保留第一個 cancel 行。
  • 其他情況,則不保留任何行。

範例

注意事項

  1. 同樣只有相同分區的資料才會在 merge 時摺疊
  1. Collapsing MergeTree 嚴格要求數據按照先寫入 sign = 1 再寫入 sign = -1 的順序,否則數據無法摺疊:
    1. 如果數據是多線程寫入則不太容易控制順序,因此 Collapsing MergeTree 的摺疊機致無法順利運作,此時可以使用 CH 提供的 Versioned Collapsing MergeTree 來解決。

Versioned Collapsing MergeTree

用途和 Collapsing MergeTree 相同,但使用不同的折疊算法,透過自定義的版本號來摺疊,因此不像 Collapsing MergeTree 受插入順序的影響。
以下為建立一個 Versioned Collapsing MergeTree 的語法:
相關參數:
  • sign - 型態為 Int8,用來表示該 row 的狀態:
    • 1:表示該 row ,稱其為 state row。
    • -1:表示該 row ,稱其為 cancel row。
  • version - 型態為 UInt* ,用來指定為版本號的欄位。

範例

注意事項
  1. Clickhouse 合併數據時會刪除每一對具有相同 primary key、version 以及不同 sign 的數據。
  1. Clickhouse 會隱式的將 version 欄位添加到 primary key。

Graphite MergeTree

用於 aggregating/averaging (rollup) Graphite 數據而設計。

參考