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

分支
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
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 行。
- 其他情況,則不保留任何行。
範例
注意事項
- 同樣只有相同分區的資料才會在 merge 時摺疊
- Collapsing MergeTree 嚴格要求數據按照先寫入 sign = 1 再寫入 sign = -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*
,用來指定為版本號的欄位。
範例
注意事項
- Clickhouse 合併數據時會刪除每一對具有相同 primary key、version 以及不同 sign 的數據。
- Clickhouse 會隱式的將 version 欄位添加到 primary key。
Graphite MergeTree
用於 aggregating/averaging (rollup) Graphite 數據而設計。