You need to enable JavaScript to run this app.
导航

如何优化查询性能?

最近更新时间2024.01.03 15:00:45

首次发布时间2021.07.21 13:23:04

感谢使用产品,保证好的性能体验是我们的职责。
那么,作为用户的你,为什么也需要知晓如何优化呢?

1. 原因

1.1 机器资源

产品是依托clickhouse作为查询引擎来提供取数、分析的能力。从技术上说,clickhouse可能是当前最快的大规模使用的OLAP引擎,短期内难以用更先进的技术替代。因此,同是clickhouse集群的情况下,机器的配置直接影响查询的速度。

1.2 数据生产

很多数据产品,平台方会负责数据的生产,用户单纯作为消费者直接使用。
本产品作为自助式洞察分析工具,既提供仪表盘、可视化等查询工具,同时也有数据集功能,让用户可以灵活的选择导入的数据、存储的结构。这两点很大程度影响查询时的性能,却又往往被忽视。很多查询的性能,往往在做完数据集的时已经注定了,想要仪表盘查的快,需要数据集做得好。

1.3 查询方式

回到查询本身,查询的数据量、使用的算子、是否命中缓存、是否匹配数据集设置等因素,都影响着查询的速度。运用合理的查询方式,往往可以通过更快的速度获取到查询结果。

2. 具体做法

公司可以通过机器资源、数据生产、查询方式三个维度进行优化,本文着重补充通过查询方式优化,提升查询性能的方法。
如查询效果仍然不佳,欢迎联系我们提供更具针对性的解决方案。

2.1 查询方式

查询方式的改进主要依赖看板、图表owner或者是可视化即时查询的用户


优化手段

判断依据以及原因

具体步骤

尽量使查询有机会 命中缓存

不管是实时数据还是离线数据,只要查询不总是要求基于最新数据,都有机会命中缓存
原因:命中缓存的查询绝大多数可以在1s内返回
* 离线数据基本都是天级别更新,一天中如果有重复查询,除了第一次查询的后续查询都能命中缓存
* 实时数据更新频率较高,但是如果不需要每次查询看到最新数据,依然可以设置例如15分钟、30分钟的缓存有效时间,这样有助于提升查询效率,降低集群压力

7月1日前,检查图表是否设置了随机抽样,随机抽样不会尝试走缓存,性能较差。如果需要抽样,可以选择默认抽样抽样
7月1日后,在可视化页面,图表设置中可以主动设置是否开启缓存
* 离线数据都可以开启缓存,DataWind会智能判断数据是否变化,决定是否更新缓存,保证不会缓存到过期数据。
* 实时数据默认开启5分钟缓存,该策略从5月上线以来,也没有用户反馈感受到数据延迟。正常情况下不需要关闭,
如果能接受更高延时,推荐加大缓存时长设置,优化查询性能
另外,尽量少使用now(),today()等函数,如果查询中包含这些函数,后台为了保证数据准确性,无法开启缓存。today()函数后续可以通过参数替代,目前可以考虑是否与p_date等价,尝试替代

缩小 查询分区 天数

查询尽量少的天数,通过缩减分区天数达到缩减查询数据量的目的

可视化查询缩减筛选条件中p_date天数,仪表盘中缩减筛选器天数

少用、替换 耗时算子

耗时算子如countd、uniqExact、quantileExact、arrayhas、like、match、jsonExract、较长case when等都可能导致查询耗时久,并且某些算子的查询效率无法通过升级集群配置提升

1. 如果不需要保证结果完全精确,可以将countd、uniqExact、quantileExact等函数替换为相应的模糊计算函数如uniq、quantile,牺牲一些精度提升查询效率
2. json类函数、case when、like等函数考虑数仓层面固化列,不要在查询时计算
3. arrayhas、arrayset等函数考虑提前建索引
总体上,尽量少的使用以上函数,或者把使用这些函数的指标单独放在某个图表中,以免拖累整张图表查询速度

少用 耗时分析功能

DataWind提供的一些分析功能在大数据量场景下会有高耗时的问题,比如LOD、同环比、对比、明细合计、透视表小计、合计等功能
原因:这些功能实现中要么有复杂的join,要么需要计算全量数据,要么需要多次计算拼装结果

1. 对比、同环比尽量控制组数,并且考虑设置常用维度项为分片键,让join过程local
2. Fixed如果可以加筛选条件,要设置维度筛选,其他LOD查询目前没有特别好的优化办法
3. 合计、百分比等功能最好选择基于当前展示数据,而非基于全量数据
总体上,大数据量(单分区 > 1亿行)下慎重使用列出的分析功能

设置 抽样

分析占比、趋势、avg、分位数等场景,可以考虑使用抽样功能
原因:抽样可以减少查询数据量,提升查询速度,降低资源消耗。在不太需要精确度的趋势、占比等场景下,抽样数据不影响对结果的分析。

在可视化页面设置抽样占比(6/25前尽量选择稳定抽样),抽样会减少读取的数据量,影响sum、count结果,但是不影响饼图占比、折线图趋势分析以及avg、quantile等算子。
抽样的数据会丢失精度,只适用特定场景进行模糊分析。

减少 维度

多数查询不超过5个维度,维度项过多会导致读取的列过多,并且增加计算成本

去除非必要维度