理解 Databend Cluster key 原理及使用
Databend Cluster Key 是指 Databend 可以按声明的 key 排序存储,主要用于用户对时间响应比较高,同时愿意为这个 cluster key 进行额排序操作的用户。 Databend 只支持一个 Cluster key,Cluster key 中可以包含多列及表达式。
基本语法
更多关于 Databend Cluster key 语法参考:
https://databend.rs/doc/sql-commands/ddl/clusterkey/
使用注意事项
目前 Databend 在表有 cluster key 的情况下,使用
copy into
replace into
这两种方式写入数据时,会自动执行 compact 和 recluster 操作。
关于 Databend Cluster Key 你需要了解的:
Databend 中数据分区按: block_size_threshold (default: 100M ) or row_per_block(default 100 万) 组织,两者任意达到之一就会生成新的 Block
新生成的 Block 中会按定义的 cluster key 排序存储,当该 key 的 min = max 时,该 block 为 constant_block, 同时 cluster key 不保证全局有序
多个 block 之间可能有重叠区间,如,cluster by (age)
不同区间的重叠形成了不同的深度,例如上图:
这样一个查询,需要查找到的深度为 3 ,即为 3 个 Block。
所以表中指定列的重叠 block-partitions 的平均深度,越小越好。如下所示:
结果中最重要信息是“average_depth”,数字越小, 表的 clustering 效果越好,上图为: 2.46,属于比较好的状态(小于 total_block_count * 0.1 ) 。block_depth_histogram
告诉更多关于每个深度有多少个分区的详细信息。 如果在较低深度中的分区数更多,则表的聚类效果更好。 例如"00004" :
38 表示 (3,4] 有 38 个 block 有 4 个深度。
其它优化建议
一般来讲声明 Cluster key 后对于区间查询和点查都有较大的优化
如果声明 cluster key 后,还想进一步的提升点查或是区间查询的能力,可以通过调整 block 大小
关于 options 查看: https://databend.rs/doc/sql-reference/table-engines/fuse#options
默认数据分布:
优化数据在 Block 中的分布
对于特别宽的表,建议查询中只访问需要的列来减少时间开销
对于复杂的 SQL 里面有大量聚合的操作还是推荐大一点的 Block 及行数
参考
https://databend.rs/doc/sql-functions/system-functions/clustering_information
https://databend.rs/doc/sql-commands/ddl/clusterkey/dml-recluster-table
版权声明: 本文为 InfoQ 作者【Databend】的原创文章。
原文链接:【http://xie.infoq.cn/article/e1a30f49b5b4315e8175e2220】。文章转载请联系作者。
评论