ByteHouse云数仓版支持对 PB 级海量数据进行高效分析,本文为您介绍在高并发点查场景下,提高查询效率和性价比的最佳实践。
ByteHouse云数仓的Server组件负责SQL的解析、优化、和查询调度,在QPS>1000的高并发场景下,公共Server容易成为性能瓶颈。因此,当您需要使用ByteHouse云数仓支撑高并发点查业务时,我们建议您购买专属Server以获得最佳性能。
专属Server是 ByteHouse 云数仓提供的 专属计算资源 解决方案,通过为用户分配独立的计算节点(Server),实现资源隔离、性能保障和更高的灵活性详情请参见专属Server。
成功购买专属Server后,后续查询即会自动使用专属Server,以保障查询的计算资源。
如果您未购买专属Server使用的是公共计算组,在同时有点查、OLAP、ELT等多种查询场景时,为了避免点查业务受其他查询场景的影响,我们建议您为点查业务购买独立的计算组。规格起步用XL(32核128GB,2 节点)即可,后续可按需升配或降配。
购买专属计算组后,后续在点查SQL中,您可在查询SQL中通过SET参数指定使用的计算组,以保障计算组资源隔离,示例如下:
select ... settings virtual_warehouse='xxx'
set virtual_warehouse='xxx'
在高并发点查场景下,建议建表时,为表设置合适的排序键/分桶键/索引。
以下面的点查SQL为例:id是表的唯一键,date是分区字段。
SELECT * FROM t WHERE id = ? and date = ? and ...;
建议建表DDL为:
CREATE TABLE t ( id Int64, date Date, ...., INDEX idx_id id TYPE bloom_filter GRANULARITY 1 ) ENGINE = CnchMergeTree PARTITION BY date UNIQUE KEY id ORDER BY id [CLUSTER BY id INTO <N> BUCKETS] -- 表或单分区行数超过100万时考虑添加 SETTINGS index_granularity = 1024;
建模说明
重要设置 | 示例 | 说明 |
---|---|---|
表参数(SETTINGS) |
| ByteHouse 为了提升大规模数据集的存储和内存使用效率,索引的最小单位不是行,而是每index_granularity行(称为granule 颗粒)。这种技术叫做稀疏索引。 |
排序键(ORDER BY) |
| 在示例的SQL中,唯一键id列的过滤条件有最佳的过滤效果。将id列作为排序键的第一个字段,查询可以充分利用主键索引(Primary Index)提前过滤掉无法命中谓词的granules。 |
跳数索引(Skip Index) |
| 主键索引由于是稀疏索引,即使某个数据文件不包含指定的id,通常也需要至少读取一个granule。 |
分桶(CLUSTER BY) |
| 分桶可以将分桶键取值相同的行分配到同一个数据文件中。针对分桶键精准过滤的查询,可以利用分桶裁剪技术,在查询规划阶段就排除掉无法命中谓词的数据文件和计算节点,从而显著提升并发性能。 |
点查的SQL建议指定 enable_point_lookup_profile = 1 参数,以获得最佳性能。
SELECT * FROM t WHERE id = 10000 SETTINGS enable_point_lookup_profile = 1;
对于Flink lookup场景,可以通过异步lookup增加查询并发,从而提升整体QPS。