怎么可能已经是 2023 年了?而且,不仅如此,现在已经是今年第二期新闻通讯的时间了!本月汇编阅读清单特别困难,因为内容量非常庞大。如果您没有关注博客或我们的社交媒体,那您应该关注一下。未来几周将会非常精彩,包括网络研讨会、面对面活动,当然还有即将发布的 23.2 版本。
如果您希望继续接收这些更新,请点击此处确认您的电子邮件偏好。
即将举行的活动
在您的日历上标记以下活动
ClickHouse v23.02 版本发布网络研讨会
时间? 2 月 23 日星期四上午 9 点(太平洋标准时间)/下午 6 点(欧洲中部时间)
如何加入? 在此处注册。
ClickHouse Meetup - 阿姆斯特丹
时间? 3 月 9 日星期四下午 6 点(欧洲中部时间)
如何加入? 在此处注册。
ClickHouse Meetup - 旧金山
时间? 3 月 14 日星期二下午 6 点(太平洋标准时间)
如何加入? 在此处注册。
ClickHouse Meetup - 奥斯汀
时间? 3 月 16 日星期四下午 6 点(欧洲中部时间)
如何加入? 在此处注册。
免费即将到来的培训
ClickHouse Cloud 入门
时间? 2 月 28 日星期二上午 8 点(太平洋标准时间)
如何加入? 在此处注册。
ClickHouse Workshop
时间? 2023 年 3 月 8 日 + 9 日上午 8 点(太平洋标准时间)
如何加入? 在此处注册。
ClickHouse v23.1
与往常一样,1 月份的发布没有让人失望。为新的一年开了个好头,推出了许多重要功能。请查看博客文章。
- 倒排全文索引 - 在此版本中,我们为 ClickHouse 中的倒排索引添加了实验性支持,作为数据跳过索引。虽然这并没有使 ClickHouse 成为功能完善的搜索引擎,但它为提高特定基于令牌的查询的性能引入了一些有趣的可能性。
- 参数化视图 - 任何编写大量 SQL 的人都很快学会欣赏视图。它们允许用户抽象出复杂的查询,并使用表语法公开它们。到目前为止,用户只能创建静态视图。在 ClickHouse 23.1 版本中,我们可以创建基于查询时传递的参数的动态视图。
- 查询结果缓存 - 为了实现最佳性能,分析数据库优化了其内部数据存储和处理管道的每个步骤。但是数据库执行的最佳工作类型是根本不做的工作!在 23.1 中,我们为 ClickHouse 缓存家族引入了一个新成员:查询结果缓存!
值得花时间观看现场演示的录像,并请升级,除非您想停留在长期支持 (LTS) 版本上。
本月查询 - “从旧上下文中形成新上下文”
可能很难相信,但有时可能拥有如此多的数据,以至于在要求的响应时间内查询是不切实际的……即使在使用 ClickHouse 时也是如此。那么,一旦您克服了查询响应时间的震惊(您有时间眨眼!?!??),您有哪些选择呢?好吧,这时我们转向 ClickHouse 工具箱并取出 SAMPLE BY。
通常我们不需要精确的答案,特别是如果您的源数据不精确,并且近似答案就足够了。在 PB 甚至 TB 规模下,一些企业可以接受一定程度的不精确性,以换取成本的大幅降低。或者,严格的延迟要求可能比完全准确性更重要。这就是 SAMPLE BY 的精神。
考虑 Wikistat 数据集。这为我们提供了自 2015 年 5 月至 2022 年 4 月期间维基百科上每个页面的每小时行,以及访问次数的计数。这是一个相当大的数据集,大约有 4250 亿行和 15TB 未压缩。对于那些有空闲时间的人,您可以按照此处的说明下载并将其加载到 ClickHouse 中。
假设我们想计算自 2015 年以来每月平均页面点击次数。这需要全表扫描才能计算出答案。在 60 核机器上,在没有调优的情况下,ClickHouse 在 5 分钟内运行此查询(受 I/O 限制)
SELECT month, avg(hits) FROM wikistat GROUP BY toStartOfMonth(time) AS month ORDER BY month ASC ┌──────month─┬──────────avg(hits)─┐ │ 2015-05-01 │ 3.617108988953329 │ │ 2015-06-01 │ 3.4978754072915894 │ │ 2015-07-01 │ 3.3329051255889595 │ │ 2015-08-01 │ 3.3877185707856237 │ │ 2015-09-01 │ 3.4814217901734508 │ … │ 2022-11-01 │ 3.5633514296196567 │ │ 2022-12-01 │ 3.5317530490738696 │ │ 2023-01-01 │ 3.5829006605488463 │ │ 2023-02-01 │ 3.4581641236938476 │ └────────────┴────────────────────┘ 94 rows in set. Elapsed: 278.166 sec. Processed 425.11 billion rows, 5.10 TB (1.53 billion rows/s., 18.34 GB/s.)
即使我们可以通过一些调优来加速它,我们也不太可能实现足够的性能提升,使其成为亚分钟级查询(没有投影,例如 ORDER BY (cityHash64(path), time)
)。但是,假设我们对这些值的近似值感到满意。我们可以天真地尝试手动抽样,方法是限制为前 100 万行。
SELECT month, avg(hits) FROM ( SELECT time, hits FROM wikistat LIMIT 1000000 ) GROUP BY toStartOfMonth(time) AS month ORDER BY month ASC ┌──────month─┬──────────avg(hits)─┐ │ 2015-05-01 │ 2.359986873769416 │ │ 2015-06-01 │ 2.292891439278604 │ │ 2015-07-01 │ 2.3796534376746785 │ │ 2015-08-01 │ 2.229300091491308 │ ... │ 2022-01-01 │ 2.395112662646779 │ │ 2022-02-01 │ 2.5044186449488826 │ │ 2022-03-01 │ 2.168976377952756 │ │ 2022-04-01 │ 2.182795698924731 │ └────────────┴────────────────────┘ 84 rows in set. Elapsed: 0.290 sec. Processed 4.91 million rows, 58.87 MB (16.91 million rows/s., 202.88 MB/s.)
300 秒到 0.2 秒是相当大的加速,但结果显然是不精确的 - 无论成本和延迟节省多少,您的经理都不太可能接受这种程度的不准确性!这可以归因于此处缺乏随机性,即我们只是使用前 100 万行。
为了解决这个问题,ClickHouse 提供了原生随机抽样。这允许用户仅对随机数据部分(样本)执行查询。这要求我们在表创建时定义一个抽样键,理想情况下,该键是主键的前缀,以获得最佳性能。
CREATE TABLE default.wikistat_sampled ( `time` DateTime CODEC(Delta(4), ZSTD(3)), `project` LowCardinality(String), `subproject` LowCardinality(String), `path` String CODEC(ZSTD(3)), `hits` UInt64 CODEC(ZSTD(3)) ) ENGINE = MergeTree ORDER BY (cityHash64(path), time) SAMPLE BY cityHash64(path)
以下是一些关键点
- SAMPLE BY 表达式必须是主键的一部分并返回整数 - 因此我们使用 cityHash64 函数。确保这不是一个递增的数字,并且在随机抽样的空间中随机分布 - 提示:使用哈希来随机化自动递增的整数。
- 如果其数据类型,它应该在域中均匀分布。在这种情况下,路径实际上是不完美的,因为它并没有完全满足此属性,但对于我们的示例来说已经足够了。更好的分布值将导致更好的抽样和更准确的估计。
- 如果需要最佳抽样性能,就像我们的情况一样,SAMPLE BY 列应该是 ORDER BY 键中的第一个元素。如果您需要优化路径匹配,您可以将其放在第二个位置,或者仅使用
cityHash64(path)=cityHash64(“value”)
。无论您如何包含它,请确保低基数列放在前面,以便允许使用通用排除算法。
我们现在可以查询,仅使用我们数据的一部分 - 将样本表示为绝对行数或0 到 1 之间的比率。下面,我们使用 1% 的数据,值为 0.01。
SELECT month, avg(hits) FROM wikistat_sampled SAMPLE 0.01 GROUP BY toStartOfMonth(time) AS month ORDER BY month ASC ┌──────month─┬──────────avg(hits)─┐ │ 2015-05-01 │ 3.2243997815421004 │ │ 2015-06-01 │ 3.1547988082990828 │ │ 2015-07-01 │ 2.9813449766968887 │ │ 2015-08-01 │ 3.0210786179578397 │ │ 2015-09-01 │ 3.1277045971550463 │ │ 2022-11-01 │ 3.4243634422663884 │ │ 2022-12-01 │ 3.415336905631455 │ │ 2023-01-01 │ 3.4066985347564027 │ │ 2023-02-01 │ 3.254118466286919 │ └────────────┴────────────────────┘ 94 rows in set. Elapsed: 6.272 sec. Processed 4.26 billion rows, 179.40 GB (679.64 million rows/s., 28.60 GB/s.)
请注意,结果的准确性是合理的,并且性能得到了显着提高。对于相同的值,此抽样在表之间完全是确定性和一致的。作为最后一点说明,以上对于平均值来说很好,但对于其他计算(例如总和),我们需要考虑我们仅在任何计算中使用样本这一事实。考虑上面的查询,但计算每月点击次数
SELECT month, sum(hits) FROM wikistat GROUP BY toStartOfMonth(time) AS month ORDER BY month ASC ┌──────month─┬───sum(hits)─┐ │ 2015-05-01 │ 18505958911 │ │ 2015-06-01 │ 16325574540 │ │ 2015-07-01 │ 15541045668 │ │ 2015-08-01 │ 15763416762 │ │ 2022-10-01 │ 16041055714 │ │ 2022-11-01 │ 16195366347 │ │ 2022-12-01 │ 15383779088 │ │ 2023-01-01 │ 16631174276 │ │ 2023-02-01 │ 5061601075 │ └────────────┴─────────────┘ 94 rows in set. Elapsed: 289.147 sec. Processed 425.11 billion rows, 5.10 TB (1.47 billion rows/s., 17.64 GB/s.)
SELECT month, sum(hits) * 100 FROM wikistat_sampled SAMPLE 1 / 100 GROUP BY toStartOfMonth(time) AS month ORDER BY month ASC ┌──────month─┬─multiply(sum(hits), 100)─┐ │ 2015-05-01 │ 16546351200 │ │ 2015-06-01 │ 14769222800 │ │ 2015-07-01 │ 13938421600 │ │ 2015-08-01 │ 14087318900 │ │ 2022-10-01 │ 15483441000 │ │ 2022-11-01 │ 15595982500 │ │ 2022-12-01 │ 14908441500 │ │ 2023-01-01 │ 15842792600 │ │ 2023-02-01 │ 4772219400 │ └────────────┴──────────────────────────┘ 94 rows in set. Elapsed: 6.184 sec. Processed 4.26 billion rows, 179.40 GB (689.32 million rows/s., 29.01 GB/s.)
阅读清单
以下是我们上个月最喜欢的一些读物,包括:
- ClickHouse 23.1 版本 - 新的一年开始了!这也是 ClickHouse 的新版本。我们很高兴推出 23.x 系列的第一个版本 23.1。
- ClickHouse 查询缓存简介 - 查询缓存基于以下理念:在某些情况下,可以缓存昂贵的
SELECT
查询的结果,以便可以直接从缓存中提供相同查询的进一步执行。 - 在 ClickHouse 中使用聚合组合器 - 组合器允许扩展和混合聚合,以解决各种数据结构。这种能力使我们能够调整查询而不是表,以回答即使是最复杂的问题。
- 使用 ClickHouse 分析 AWS Flow Logs - 调试安全组问题、监控入口和出口流量、检查跨可用区流量,所有这些都是为了减少您的云支出。AWS VPC Flow Logs 允许您捕获有关进出 VPC 中网络接口的 IP 流量的详细信息。
- 在 ClickHouse 中引入倒排索引 - 经过长时间的制作,ClickHouse v23.1 发布了一个备受期待的功能 - 对倒排索引的实验性支持。“非常感谢!”IBM,他们在过去六个月中开发并贡献了倒排索引的代码。
- ClickHouse 和 dbt - 来自社区的礼物 - 作为一家致力于开源精神的公司,重要的是我们不仅要接受来自社区的请求,还要接受功能和新的集成。在这篇文章中,我们探讨了 dbt、它与 ClickHouse 结合使用时可能带来的价值,以及关于为更高级功能发展支持的小故事。
- 使用 TTL 管理 ClickHouse 中的数据生命周期 - 如果您在 ClickHouse 中分析的数据随着时间的推移而增长,您可能需要计划按计划移动、删除或汇总较旧的数据。ClickHouse 具有一个简单而强大的数据生命周期管理工具,该工具通过 DDL 语句的
TTL
子句配置。 - ClickHouse 中的数据格式简介 - ClickHouse 的新用户通常会对支持的数据格式的数量感到惊讶,但有时需要帮助来确定加载数据的最佳和最简单方法。这篇文章简要概述了 ClickHouse 对不同格式的广泛支持以及如何加载本地文件。
- ClickHouse Fiddle — ClickHouse 的 SQL Playground - 有时我们希望在线运行 SQL 查询以验证它们、与其他人共享它们,或者只是因为我们懒得在本地安装数据库。在线 SQL Playground 可以帮助我们解决这个问题。
- 在 ClickHouse 中使用物化视图 - 在现实世界中,数据不仅需要存储,还需要处理。在这篇博文中,我们探讨了物化视图以及如何在 ClickHouse 中使用它们来加速查询以及数据转换、过滤和路由任务。
感谢阅读,我们下个月再见。
ClickHouse 团队