Clickhouse上用Order By保证绝对正确结果但代价是性能

Clickhouse MergeTree排序键建立后还能修改吗? 这个问题需要分情况讨论,首先有2个前提: MergeTree主键建立以后是不能修改的 主键必须和排序键一致或是排序键的前缀,即主键是A,排序键可以是A或(A,B),但不能是B 阅读详情

Clickhouse上用Order By保证绝对正确结果但代价是性能

一些聚合函数的结果跟流入数据的顺序有关,CH文档明确说明这样的函数的结果是不确定的。这是为什么呢?让我们用explain pipeline来一探究竟。

以一个很简单的查询为例:

select any( step ) from events group by request_id;

events表的定义如下:

CREATE TABLE default.events
(
    `ID` UInt64,
    `request_id` String,
    `step_id` Int64,
    `step` String
)
ENGINE = MergeTree
ORDER BY ID

该查询从events表里面读取数据步骤 step 和请求ID request_id ,按照request_id分组并取第一个step。

我们看一下这个查询的pipeline:

localhost :) explain pipeline select any( `step`) from events group by request_id

┌─explain────────────────────────────────┐
│ (Expression)                           │
│ ExpressionTransform                    │
│   (Aggregating)                        │
│   Resize 32 → 1                        │
│     AggregatingTransform × 32          │
│       StrictResize 32 → 32             │
│         (Expression)                   │
│         ExpressionTransform × 32       │
│           (SettingQuotaAndLimits)      │
│             (ReadFromMergeTree)        │
│             MergeTreeThread × 32 0 → 1 │
└────────────────────────────────────────┘

可以看出没有sorting步骤。这个查询在多核服务器中速度是相当快的,因为充分利用了多核,直到最后一步才归并成一个数据流由一个线程来处理。

可是要注意 这个查询的结果每次都不一样,可以用加过滤条件的计数来测试,测试的SQL如下:

select countIf(A='step1') from (select any( `step`) as A from (select * from events) group by request_id)

结果是:2500579, 2500635,2500660。结果差距都不大,但都不是绝对正确的结果。这是因为多线程执行时并不能严格保证是按照engine=MergeTree 的表的存储顺序来处理数据的。如果能容忍误差就没问题,因为这个查询的效率是非常高的。

但如果要追求绝对的正确结果。则需要显示地指定顺序,改造查询如下:

select any( step ) from (select * from events order by ID) group by request_id;

查询的pipeline变成这样:

localhost :) explain pipeline select any( step ) from (select * from events order by ID) group by request_id;

┌─explain─────────────────────────────────┐
│ (Expression)                            │
│ ExpressionTransform                     │
│   (Aggregating)                         │
│   AggregatingTransform                  │
│     (Expression)                        │
│     ExpressionTransform                 │
│       (Sorting)                         │
│       MergingSortedTransform 36 → 1     │
│         (Expression)                    │
│         ExpressionTransform × 36        │
│           (SettingQuotaAndLimits)       │
│             (ReadFromMergeTree)         │
│             MergeTreeInOrder × 36 0 → 1 │
└─────────────────────────────────────────┘

注意到pipeline中增加了重要的一步MergingSortedTransform 36 → 1,这一步保证了查询的正确性,但是将多个线程的数据流归集到一起,排序后继续由一个线程完成剩下的处理步骤,效率上受到很大的影响。测试结果表示:加了ORDER BY 子句的查询能够得到一致的正确结果,但效率差了至少10倍。越是核数多的服务器,其差距越大。

【Clickhouse从入门到精通】第36篇:ClickHouse分组聚合深度解析——GROUP BY与HAVING 摘要 本文是ClickHouse系列教程第36篇,深入解析GROUP BY分组聚合功能。文章系统介绍了基础语法、执行原理和性能优化策略,重点讲解了ROLLUP、CUBE、TOTALS三种高级分组语法及其应用场景。通过实际案例展示了ClickHouse在向量化聚合、并行计算和内存管理方面的技术优势,帮助读者掌握多维数据分析的核心技能。 关键词:GROUP BY、ROLLUP、CUBE、TOTALS、聚合优化、多维分析 阅读详情

相关推荐

使用Python对比Clickhouse查询结果和CSV文件内容的差异

需要考虑SQL结果集是大数据量分批数据导出的情况,通过多线程和异步操作来提高程序性能,程序需要异常处理和输出,输出出错时的错误信息,每次每个查询导出数据的运行状态和表数据行数以及运行时间戳,导出时间,输出每个文件记录数量的日志。以下方案能够处理TB级数据量的比较任务,通过合理的批次大小和线程数配置,可以在保证系统稳定的前提下最大化比较速度。

weixin_30777913的博客 847

探究下Clickhouse中的order by

相邻的行通常具有相同的值,这些相同的值将被存储在一起,从而提高了数据的压缩率。此外,按照 ORDER BY 子句排序后的数据可以更好地支持某些查询操作,例如范围查询和TOP-N查询,从而减少了需要维护的索引结构,降低了存储空间的使用。具体而言,ORDER BY 子句指定了数据在物理存储中的排序方式,从而决定了数据的压缩率和碎片程度,进而影响数据的存储空间大小。需要注意的是,在使用 ORDER BY 子句时,需要根据实际的数据情况来选择排序键,以便最大限度地减少数据的存储空间。

轰轰烈烈的生活 9976

大数据ClickHouse进阶(十四):ClickHouse的HAVING和ORDER BY子句

Order by 子句通过声明排序键来指定查询数据返回时的顺序。在MergeTree表引擎中指定order by 后,数据在各个分区内按照其定义的规则排序,这是一种分区内的局部排序,如果在查询时数据跨越了多个分区,则他们返回的顺序是无法预知的,每一次查询返回的顺序都有可能不同。这种情况下,如果希望数据总是能够按照期望的顺序返回,就需要借助Order by 子句来指定全局排序。ClickHouse也支持Having子句,需要与group by 同时出现,不能单独使用,它能够在聚合计算之后实现二次过滤数据。

Lansonli(蓝深李)的博客 2182

ClickHouse 建表create table时primary by与order by

参考文章:https://cloud.tencent.com/developer/article/1604965 一、 ORDER BY 决定了每个分区中数据的排序规则; PRIMARY KEY 决定了一级索引(primary.idx); ORDER BY 可以指代PRIMARY KEY, 通常只用声明ORDER BY 即可。 MergeTree的主键(PRIMARY KEY)只是用来生成一级索引(primary.idx)的,并没有唯一性约束这样的语义。 Replacin...

祁东握力的博客 2万+

22.3 ORDER BY语句的优化

22.3 ORDER BY语句的优化 在查询语句中使用ORDER BY进行排序时,尽量保证ORDER BY子句的字段上存在索引。例如,查询t_goods数据表中的数据,并按照t_stock字段进行排序。 mysql> EXPLAIN SELECT id FROM t_goods ORDER BY t_stock \G *************************** ...

weixin_41275260的博客 131

Silvaco TCAD仿真例库——肖特基二极管反向击穿特性(案例)

本文详细介绍了使用Silvaco TCAD仿真例库分析肖特基二极管反向击穿特性的完整流程。通过搭建带保护环的器件结构,配置关键物理模型,并执行反向偏压扫描,深入探讨了雪崩击穿机制、电场分布及设计参数(如漂移区浓度、保护环)对击穿电压的影响,为功率半导体设计与可靠性分析提供了实用的虚拟实验方法。

weixin_29165465的博客 388

Clickhouse

与mysql类似,表引擎决定其特征,clickhouse不同引擎之间区别很大,分为六类20多种MergeTree系列引擎外部存储类型文件类型内存类型接口类型其它类型其中MergeTree系列引擎性能强大、使用场景广,也只有MergeTree系列引擎才支持主键索引、数据分区、数据副本和数据采样这些特性MergeTree。

qq_51384368的博客 2806

从命令到对话:LLM如何重塑车载语音交互与软件定义汽车体验

自动语音识别和自然语言处理是智能交互的核心基础技术,它们使机器能够理解和响应人类语音指令。其原理在于通过声学模型和语言模型将声音信号转化为文本,再解析文本背后的用户意图。这项技术的价值在于提供了一种自然、高效且能解放双手的人机交互方式,极大地提升了在特定场景(如驾驶)下的安全性与便利性。随着技术演进,其应用场景已从简单的命令控制扩展到复杂的多轮对话和跨域任务执行。当前,软件定义汽车的架构变革为车载语音提供了统一的控制平台,而大型语言模型的引入则带来了范式革命,使其从功能触发器进化为真正的智能任务执行者。本文

weixin_42669344的博客 563

Clickhouse如何完全保证数据的去重

ClickHouse通过一系列从底层到应用层的多层次机制来完全保证数据去重,包括基于主键的去重策略、等特殊引擎的使用、数据合并操作中的去重优化、查询优化中的去重功能,以及副本管理和批量操作中的去重控制。这些机制共同确保ClickHouse在处理大规模数据的同时,能够保持数据的一致性和准确性。

goTsHgo的博客 4302

Matlab Robotics Toolbox实战:四自由度机械臂建模与仿真全流程(附代码)

本文详细介绍了使用Matlab Robotics Toolbox进行四自由度机械臂建模与仿真的全流程,包括DH参数定义、模型构建、可视化、运动学仿真及交互控制。通过实战案例和代码示例,帮助读者快速掌握机械臂建模技巧,提升机器人学习效率。

weixin_42538752的博客 415

四足机器人——机械结构

目录 一、四足机器人腿型: 1、并联腿 2、串联腿 3、 腿的布局(关节配置) 二、四足机器人足端设计: 三、四足机器人膝关节驱动: 1、皮带轮驱动: 2、四连杆或者推杆驱动 四、四足机器人机械整体结构设计细节 一、四足机器人腿型: 1、并联腿 优点:受力角度来说,并联腿比串联腿好,并联腿较为灵活。 2、串联腿 优点:运动范围大 3、 腿的布局(关节配置) 为了使机器人具有较好的稳定性,一般会采用比较低的重心。这就导致了机器人腿的髋关节位置需要位于机器人身体的两侧..

m0_58585940的博客 3万+

ClickHouse主键无唯一性约束的应对策略与ReplacingMergeTree实战

本文深入解析了ClickHouse主键不保证数据唯一性的设计原因,并重点介绍了ReplacingMergeTree引擎的实战应用。针对稀疏索引架构下的数据重复问题,文章详细阐述了如何通过ORDER BY键、版本号及分区策略实现延迟去重,并提供了手动触发合并与跨分区重复的应对策略,帮助开发者在OLAP场景下平衡性能与数据一致性。

pz890123的博客 978

从零到一:用CubeMX和485模块快速上手多摩川绝对式编码器(附清零操作详解)

本文详细介绍了如何使用STM32CubeMX和485模块快速上手多摩川绝对式编码器,包括硬件连接、STM32配置、协议解析及清零操作。通过具体的代码示例和调试技巧,帮助开发者高效实现编码器数据读取和清零功能,特别适合STM32单片机开发者参考。

weixin_30599769的博客 190

基于ClickHouse的近实时数据更新方案

众所周知,主攻OLAP场景的数据库引擎一般都会采用某种列式存储格式,以支撑其强大的数据处理性能,当无法同时兼顾行级事务,以及频繁的数据实时更新操作。如ROLAP中的Hive、Impala、Presto、ClickHouse,以及MOLAP中的Druid、Kylin,等等。

TomAndersen的博客 6617

VMware共享磁盘配置实战:从零搭建多机共享存储环境

本文详细介绍了在VMware环境中从零开始配置共享磁盘的完整实战流程。通过创建共享磁盘、挂载至多台虚拟机并修改.vmx配置文件等关键步骤,帮助用户搭建可用于数据库集群(如Oracle RAC)测试的多机共享存储环境,并提供了核心参数设置与常见问题排查指南。

weixin_29284201的博客 490

基于STM32的智能电子秤设计毕业论文

摘要:本文设计了一款基于STM32F103C8T6的智能电子秤系统,通过HX711称重传感器实现高精度测量,采用OLED显示和矩阵键盘完成人机交互。系统包含重量采集、数据处理、单价设置、去皮清零及总价计算等功能模块,经测试测量误差小于0.1%,稳定性良好。研究实现了低成本、高可靠性的智能称重方案,为后续无线传输和AI算法集成奠定了基础。关键词:STM32;智能电子秤;HX711;OLED显示;矩阵键盘。

3254968421的博客 847

【clickhouse】ReplacingMergeTree

ClickHouse的ReplacingMergeTree引擎实现了一种高效的数据版本管理方案,适用于频繁更新的场景。该引擎通过后台合并过程自动保留最新版本数据(基于指定版本字段),同时支持历史数据存储。在具体实现上,建议将MAC地址转为UInt64类型提高性能,并合理设置分区策略以优化合并效率。查询时推荐使用argMax函数而非FINAL关键字获取最新数据,避免性能问题。对于高频更新场景,建议采用"历史+当前"分离架构,或结合Redis缓存实时最新数据。虽然ReplacingMerge

言之。 1万+

QMK固件OLED显示屏配置教程:从零开始实现个性化键盘显示(实操部分)

本教程详细介绍了如何从零开始配置QMK固件的OLED显示屏,实现个性化键盘显示。首先,文章解释了OLED显示屏的基本概念及其在键盘中的应用,并介绍了I2C和SPI两种通信方式。接着,教程逐步指导用户如何在QMK固件中启用OLED功能,包括在rules.mk中启用OLED、在halconf.h和mcuconf.h中配置I2C功能,以及在config.h中设置I2C和OLED参数。最后,教程展示了如何在keymap.c中编写代码,实现OLED显示内容,并提供了进阶定制功能,如显示当前层信息、按键状态和QMK L

Despacito0o的博客 578

clickhouse查询使用order by和limit,不同limit查询出现重复数据问题【已解决】

ClickHouse 的 ORDER BY 是基于指定字段排序的。如果排序字段有重复值,ClickHouse 没有隐式的二级排序规则(除非你显式指定额外的列排序)。简单来说就是表里有时间戳字段timestamp,我想当然的以为这个字段是唯一的,于是根据timestamp进行排序,分页查询,但是处理过程中发现,一直有重复数据处理。这种情况的根本原因是排序的不确定性:当多个行的排序键相同时,ClickHouse 无法保证它们在分页之间的顺序稳定。由于排序的不确定性,这些行可能又被下一页再次选中。

qq_43133294的博客 1029

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Clickhouse 表

摘要:ClickHouse建表语法需指定ENGINE引擎,核心组件包括表引擎(如MergeTree、Log、Distributed)、排序键(影响查询性能)、分区键(数据管理)和主键(构建稀疏索引)。MergeTree引擎最常用,需合理设计分区粒度(建议1GB-10GB)和排序键顺序(高频过滤字段优先)。实战示例展示了标准表、分布式表及表结构复制的创建方法。京东最佳实践建议:避免高基数字段分区,优先使用数值类型,慎用Nullable,处理更新时考虑ReplacingMergeTree引擎。

onlymscn的博客 748

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

clickhouse存储和分区

分区是将一张表的整体数据按指定规则拆分成多个独立的 “数据分区(Partition)”,每个分区是物理上独立的文件目录,存储该分区范围内的数据。可以类比为:把一个大文件柜,按 “月份” 分成 12 个抽屉,每个抽屉只放对应月份的数据,而非所有数据堆在一个抽屉里。排序(ORDER BY)是指定 MergeTree 表中每个数据片段(Part)内的数据按哪些字段排序存储,是 MergeTree 引擎最核心的配置(没有排序键的 MergeTree 无意义)。

bobozai86的博客 990

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ClickHouse系列之数据一致性保证

对于ReplacingMergeTree引擎,我们之前讲过在后台合并的时间不定,合并前查询会存在数据不一致问题。查询结果如下:1,上海,静安,场中小区,61000,2022-06-01 00:00:001,上海,静安,场中小区,61000,2022-06-01 00:00:001,上海,静安,场中小区,60000,2022-05-01 00:00:001,上海,静安,场中小区,60000,2022-05-01 00:00:00为保证数据一致性,有以下解决方案。

算法小生 1441

多维聚合实战:从SQL GROUP BY到ClickHouse物化视图的工程落地

多维聚合是数据分析与数仓建设的核心能力,本质是将高维业务数据空间通过分组、预计算与维度建模进行高效折叠。其技术原理涵盖GROUP BY扩展语法(ROLLUP/CUBE/GROUPING SETS)、维度表设计(SCD、层级、时间维度)、聚合粒度权衡及引擎特异性优化(如ClickHouse物化视图+ReplacingMergeTree、PySpark shuffle调优)。关键技术价值在于平衡查询性能、存储成本与业务灵活性,支撑BI下钻、同环比分析、实时风控等典型场景。本文聚焦真实工程约束下的落地路径,覆盖P

weixin_30466039的博客 405

ClickHouse 数据采样:查询提速 10 倍

你正在处理一份 TB 级的网站访问日志表,全量聚合查询要跑好几分钟,而 ClickHouse 数据采样(`SAMPLE` 子句)让你只扫描部分数据就能拿到近似结果。前提只有一个:建表时指定采样键。下面从建表到出结果,把完整链路走一遍。 ## 它到底解决了什么问题 - 查询耗时从分钟级降到秒级甚至更低:`SAMPLE 0.1` 只扫描 10% 的数据,延迟直接降到原来的十分之一左右 - 结果是确

gitblog_00529的博客 1091

ClickHouse数据采样实战指南:10倍速提升海量数据分析性能

ClickHouse作为实时分析型数据库管理系统,其数据采样功能是企业处理TB级海量数据时的核心性能优化手段。通过智能采样机制,数据团队可以在保持统计精度的同时,将复杂分析查询的响应时间从分钟级降至秒级,为实时决策提供技术支撑。 ## 问题导向:海量数据分析的性能瓶颈 在典型的大数据分析场景中,企业面临三个核心挑战:查询延迟影响业务决策、硬件资源成本居高不下、全量扫描导致系统过载。传统的数据仓

gitblog_00437的博客 673

ClickHouse--20--Projection (投影)

投影类似于物化视图,但在part-level上定义。投影存储在分区目录中。它类似于索引,但包含存储匿名MergeTree表分区的子目录。这个表是由投影的定义查询生成的如果存在GROUP BY子句,底层存储引擎变成AggregatingMergeTree,所有聚合函数都转换为AggregateFunction如果有ORDER BY子句,则MergeTree表将其用作主键表达式。在合并过程中,投影分区通过其存储的合并例程进行合并父表分区的校验和与投影分区相结合其他维护任务类似于跳过索引。

时光里的博客 1349
上一篇: Clickhouse执行处理查询语句(包括DDL,DML)的过程
下一篇: 用指针低三位存放额外信息的优化方法
Ahxing1985
博客等级 码龄22年 179粉丝 57原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值