利志分享
fast_forward
view_headline
开发工具箱
go教程
clickhouse教程
kafka教程
python教程
shell教程
原创杂文
打赏
开发工具箱
go教程
clickhouse教程
kafka教程
python教程
shell教程
原创杂文
打赏
clickhouse入门
clickhouse概述
clickhouse安装和部署
clickhouse数据类型
clickhouse表引擎学习
clickhouse表引擎学习2
clickhouse的sql语法功能1-创建库,创建表等
clickhouse的sql语法2之select功能
clickhouse的sql语法3之alter和show功能
clickhouse的sql语法4之system的了解-查看当前实时连接数
clickhouse的sql语法5之账号授权功能
浅析Clickhouse的向量化执行
clickhouse时间日期函数详解-toDate,toDateTime,formatDateTime
clickhouse常用字符串函数-empty,length,lower,upper,substring,splitByString
clickhouse常用数组函数-arrayJoin,arraySort,arrayReverseSort,arrayReduce,arrayDistinct
clickhouse常用hash函数和类型转换函数,随机函数
clickhouse实战
clickhouse实现漏斗功能
clickhouse实现留存数和留存率计算
你想要的-提高统计clickhouse的查询效率,clickhouse物化视图的应用
剖析-clickhouse的复制表引擎重复数据无法写入问题
clickhouse分布式查询报错剖析-Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = 'deny'
有料-clickhouse单机的增删查询实现方案和clickhouse分布式部署的增删查改实现方案
clickhouse的go客户端实现插入分布式clickhouse集群方式
分布式物化视图在clickhouse如何实现?
助你成为数据分析达人-带你透彻的了解clickhouse实现同比环比分析
如何在clickhouse中实现连续的时间,比如连续的天
第二篇:如何在clickhouse中实现连续的时间,比如连续的天
clickhouse中toDate和toDateTime不能处理1970年之前时间问题
分享clickhouse分布式集群CPU突然暴涨接近100%的问题查证和分析
clickhouse一个特殊的Inf类型数据引发的数据问题
clickhouse的MergeTree系列引擎ReplacingMergeTree和SummingMergeTree的深入理解
sql中多表组合笛卡尔积引发数据动态变化的问题
clickhouse之删除数据或更新数据无效的解决思路-mutations相关
clickhouse(20.3.10.75版本) Sql报错总结
clickhouse网络架构问题引发的:All connection tries failed,Attempt to read after eof,While executing Remote报错
clickhouse深入
深入了解clickhouse的索引查询过程
详解clickhouse的MergeTree引擎存储结构
Clickhouse如何分析sql查询计划完整指南
详解clickhouse分区目录的合并过程
目录
clickhouse入门
clickhouse概述
clickhouse安装和部署
clickhouse数据类型
clickhouse表引擎学习
clickhouse表引擎学习2
clickhouse的sql语法功能1-创建库,创建表等
clickhouse的sql语法2之select功能
clickhouse的sql语法3之alter和show功能
clickhouse的sql语法4之system的了解-查看当前实时连接数
clickhouse的sql语法5之账号授权功能
浅析Clickhouse的向量化执行
clickhouse时间日期函数详解-toDate,toDateTime,formatDateTime
clickhouse常用字符串函数-empty,length,lower,upper,substring,splitByString
clickhouse常用数组函数-arrayJoin,arraySort,arrayReverseSort,arrayReduce,arrayDistinct
clickhouse常用hash函数和类型转换函数,随机函数
clickhouse实战
clickhouse实现漏斗功能
clickhouse实现留存数和留存率计算
你想要的-提高统计clickhouse的查询效率,clickhouse物化视图的应用
剖析-clickhouse的复制表引擎重复数据无法写入问题
clickhouse分布式查询报错剖析-Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = 'deny'
有料-clickhouse单机的增删查询实现方案和clickhouse分布式部署的增删查改实现方案
clickhouse的go客户端实现插入分布式clickhouse集群方式
分布式物化视图在clickhouse如何实现?
助你成为数据分析达人-带你透彻的了解clickhouse实现同比环比分析
如何在clickhouse中实现连续的时间,比如连续的天
第二篇:如何在clickhouse中实现连续的时间,比如连续的天
clickhouse中toDate和toDateTime不能处理1970年之前时间问题
分享clickhouse分布式集群CPU突然暴涨接近100%的问题查证和分析
clickhouse一个特殊的Inf类型数据引发的数据问题
clickhouse的MergeTree系列引擎ReplacingMergeTree和SummingMergeTree的深入理解
sql中多表组合笛卡尔积引发数据动态变化的问题
clickhouse之删除数据或更新数据无效的解决思路-mutations相关
clickhouse(20.3.10.75版本) Sql报错总结
clickhouse网络架构问题引发的:All connection tries failed,Attempt to read after eof,While executing Remote报错
clickhouse深入
深入了解clickhouse的索引查询过程
详解clickhouse的MergeTree引擎存储结构
Clickhouse如何分析sql查询计划完整指南
详解clickhouse分区目录的合并过程
浅析Clickhouse的向量化执行
阅读:203
分享次数:0
关于Clickhouse之所以会像闪电一样快,是多方面的优化,包过但不仅限于:高效且磁盘友好的列式存储,高效的数据压缩,精心设计的各类索引,并行分布式查询,运行时代码生成等。 坊间有句玩笑,即“能用钱解决的问题,千万别花时间”。而业界也有种调侃如出一辙,即“能升级硬件解决的问题,千万别优化程序”。有时候,你千辛万苦优化程序逻辑带来的性能提升,还不如直接升级硬件来得简单直接。这虽然只是一句玩笑不能当真,但硬件层面的优化确实是最直接、最高效的提升途径之一。向量化执行就是这种方式的典型代表,这项寄存器硬件层面的特性,为上层应用程序的性能带来了指数级的提升。 向量化执行,可以简单地看作一项消除程序中循环的优化。这里用一个形象的例子比喻。小胡经营了一家果汁店,虽然店里的鲜榨苹果汁深受大家喜爱,但客户总是抱怨制作果汁的速度太慢。小胡的店里只有一台榨汁机,每次他都会从篮子里拿出一个苹果,放到榨汁机内等待出汁。如果有8个客户,每个客户都点了一杯苹果汁,那么小胡需要重复循环8次上述的榨汁流程,才能榨出8杯苹果汁。如果制作一杯果汁需要5分钟,那么全部制作完毕则需要40分钟。为了提升果汁的制作速度,小胡想出了一个办法。他将榨汁机的数量从1台增加到了8台,这么一来,他就可以从篮子里一次性拿出8个苹果,分别放入8台榨汁机同时榨汁。此时,小胡只需要5分钟就能够制作出8杯苹果汁。为了制作n杯果汁,非向量化执行的方式是用1台榨汁机重复循环制作n次,而向量化执行的方式是用n台榨汁机只执行1次。 为了实现向量化执行,需要利用CPU的SIMD指令。SIMD的全称是Single Instruction Multiple Data,即用单条指令操作多条数据。现代计算机系统概念中,它是通过数据并行以提高性能的一种实现方式(其他的还有指令级并行和线程级并行),它的原理是在CPU寄存器层面实现数据的并行操作。CPU是如何实现SIMD的呢?答案是扩展指令集。Intel的第一版SIMD扩展指令集称为MMX,于1997年发布。后来至今的改进版本有SSE(Streaming SIMD Extensions)、AVX(Advanced Vector Extensions),以及AMD的3DNow!等。ClickHouse的向量化执行机制主要依赖于SSE指令集,下面简要介绍之。 ### SSE指令集 SSE指令集是MMX的继任者,其第一版早在Pentium III时代就被引入了。随着新指令的扩充,又有了SSE2、SSE3、SSSE3、SSE4(包含4.1和4.2)等新版本。我们可以通过cpuid类软件获得处理器对SSE指令集的支持信息,下图以笔者自用MacBook Pro中的Intel Core i9-9880H为例。并不仅有Intel的处理器才支持SSE指令集,AMD的同样也支持。 ClickHouse提供的检查CPU是否支持SSE4.2的命令如下。 ``` grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported" ``` SSE指令集以8个128位寄存器为基础,命名为XMM0~XMM7。在AMD64(即64位扩展)指令集中,又新增了XMM8~XMM15。一个XMM寄存器原本只能存储一种数据类型: - 4个32位单精度浮点数 SSE2又扩展到能够存储以下类型: - 2个64位双精度浮点数 - 2个64位/4个32位/8个16位整数 - 16个字节或字符 SSE的指令分为两大类,一是标量(scalar)指令,二是打包(packed)指令。标量指令只对XMM寄存器中的最低位数据进行计算,打包指令则是对所有数据进行计算。下图示出SSE1中,单精度浮点数乘法的标量和打包运算。介绍一篇很好的SSE入门:http://www.songho.ca/misc/sse/sse.html 利用SSE指令集的三种方式: - 直接编写(内嵌)汇编语句; - 利用厂商提供的扩展库函数。Intel将这类指令和函数统称为intrinsics,官方提供的速查手册见这里; - 开启编译器的优化(-msse、-msse2等等),编译器会自动将符合条件的情景(如数组相加、矩阵相乘等)编译为intrinsic指令。 需要注意的是,SIMD和SSE虽然强大,但是对于那些严重依赖流程控制(flow-control-heavy)的任务,即有大量分支、跳转和条件判断的任务明显不太适用。也就是说,它们主要被用来优化可并行计算的简单场景,以及可能被频繁调用的基础逻辑。 参考文献:《ClickHouse原理解析与应用实践》
感觉本站内容不错,读后有收获?
attach_money
我要小额打赏,鼓励作者写出更好的教程
扫码关注公众号:talk_lizhi