理解 Databend Cluster key 原理及使用

Databend Cluster Key 是指 Databend 可以按聲明的 key 排序存儲(chǔ),主要用于用戶對(duì)時(shí)間響應(yīng)比較高,同時(shí)愿意為這個(gè) cluster key 進(jìn)行額排序操作的用戶。 Databend 只支持一個(gè) Cluster key,Cluster key中可以包含多列及表達(dá)式。
基本語法
更多關(guān)于 Databend Cluster key 語法參考:
https://databend.rs/doc/sql-commands/ddl/clusterkey/
使用注意事項(xiàng)
目前 Databend 在表有 cluster key 的情況下,使用
copy into
replace into
這兩種方式寫入數(shù)據(jù)時(shí),會(huì)自動(dòng)執(zhí)行 compact 和 recluster 操作。
關(guān)于 Databend Cluster Key 你需要了解的:
Databend 中數(shù)據(jù)分區(qū)按: block_size_threshold (default: 100M ) or row_per_block(default 100萬) 組織,兩者任意達(dá)到之一就會(huì)生成新的 Block
新生成的 Block 中會(huì)按定義的 cluster key 排序存儲(chǔ),當(dāng)該key的 min = max 時(shí),該 block 為 constant_block, 同時(shí) cluster key 不保證全局有序
多個(gè) block 之間可能有重疊區(qū)間,如,cluster by (age)

不同區(qū)間的重疊形成了不同的深度,例如上圖:
這樣一個(gè)查詢,需要查找到的深度為 3 ,即為 3 個(gè) Block。
所以表中指定列的重疊block-partitions的平均深度,越小越好。如下所示:
結(jié)果中最重要信息是“average_depth”,數(shù)字越小, 表的clustering效果越好,上圖為: 2.46,屬于比較好的狀態(tài)(小于 total_block_count * 0.1 ) 。block_depth_histogram
告訴更多關(guān)于每個(gè)深度有多少個(gè)分區(qū)的詳細(xì)信息。 如果在較低深度中的分區(qū)數(shù)更多,則表的聚類效果更好。 例如"00004" :
38 表示 (3,4] 有 38 個(gè) block 有 4 個(gè)深度。
其它優(yōu)化建議
一般來講聲明 Cluster key 后對(duì)于區(qū)間查詢和點(diǎn)查都有較大的優(yōu)化
如果聲明 cluster key 后,還想進(jìn)一步的提升點(diǎn)查或是區(qū)間查詢的能力,可以通過調(diào)整 block 大小
關(guān)于 options 查看: https://databend.rs/doc/sql-reference/table-engines/fuse#options
默認(rèn)數(shù)據(jù)分布:

優(yōu)化數(shù)據(jù)在 Block 中的分布

3. 對(duì)于特別寬的表,建議查詢中只訪問需要的列來減少時(shí)間開銷


4. 對(duì)于復(fù)雜的 SQL 里面有大量聚合的操作還是推薦大一點(diǎn)的 Block 及行數(shù)
參考
https://databend.rs/doc/sql-functions/system-functions/clustering_information
https://databend.rs/doc/sql-commands/ddl/clusterkey/dml-recluster-table