中间件--ClickHouse-4--向量化执行(什么是向量?为什么向量化执行的更快?)

1、向量(Vector)的概念

(1)、向量的定义

  • 向量:在计算机科学中,向量是一组同类型数据的有序集合,例如一个包含多个数值的数组。在数据库中,向量通常指批量数据(如一列数据的多个值组成的集合)。
    理解:Java中的一个int数组或String列表等都算一个向量。
    示例:
向量 A = [1, 2, 3, 4, 5]
  • 向量化(Vectorization):通过单条指令同时对多个数据元素进行操作的技术,例如用一条指令对一个向量中的所有元素执行加法运算。

(2)、向量的特点

  • 同质性:向量中的所有元素都属于同一数据类型
  • 连续性:向量中的数据在内存中是连续存储的,这使得访问和操作非常高效。
  • 批量处理:可以一次性对整个向量进行操作,而不是逐条处理单个元素。

(3)、向量在ClickHouse中的具体形式

  • 数据块(Block):
    ClickHouse将数据按列式存储,每个列的数据被划分为多个数据块(Block)。每个块包含固定数量的行(如8192行),形成一个向量。
    示例:
    列 “age” 的数据块可能包含 [25, 30, 35, 40, …](默认:8192个值)。

  • SIMD寄存器:
    CPU的SIMD(Single Instruction Multiple Data)寄存器(如SSE、AVX)可以同时存储多个数据元素,例如一个 128 位寄存器可存储4个32位整数。向量化执行时,数据块会被加载到这些寄存器中,通过一条指令并行处理多个元素

2、向量化执行的实现方式

(1)、向量化执行的核心思想

传统行式执行(Row-wise)逐行处理数据,而向量化执行以数据块(向量)为单位处理数据,减少循环次数和函数调用开销。
对比示例:
传统行式方式:循环处理每行 → 处理10000行需要10000次循环;

for i in range(len(data)):result[i] = data[i] * data[i]

向量化方式:每次处理一个块(如8192行) → 仅需2次循环。

  result = [x * x for x in data]

解释:
向量化执行通过SIMD指令(如SSE4.2、AVX)对向量中的多个数据同时执行相同操作,一次可以执行8192个数据,所以只需要2次执行即可。

(2)、ClickHouse的向量化执行流程

  1. 数据加载:
    列式数据从磁盘加载到内存,按固定大小(如8192行)划分为数据块。
  2. 批量运算:
    对每个数据块执行操作(如过滤、聚合、计算),利用SIMD指令并行处理多个元素。
  3. 结果合并:
    各数据块的中间结果合并为最终结果。

(3)、向量化与列式存储的结合

  • 列式存储:
    数据按列存储,天然适合批量读取和处理(如只读取需要的列)。
  • 缓存优化:
    连续的列数据块更易被CPU缓存命中,减少内存访问延迟。

3、向量化执行与传统执行方式的对比

(1)、传统行式执行(Row-wise)的局限

在这里插入图片描述

(2)、具体性能提升示例

  • 过滤操作:
    传统方式:遍历每行,判断 WHERE age > 30 → 循环次数多。
    向量化方式:对数据块 age 列的8192个值同时比较 → 一条指令完成。

  • 聚合操作:
    传统方式:逐行累加SUM(age) → 8192次加法。
    向量化方式:将数据块分成多个SIMD向量,每个向量并行累加 → 减少到约2048次加法。

4、向量化执行的核心优势

(1)、减少函数调用开销

  • 传统方式:每行调用函数 → 函数调用次数与行数线性相关。
  • 向量化:按块调用 → 函数调用次数减少 块大小 倍。

(2)、提升CPU缓存效率

  • 连续列式数据块加载到缓存,减少内存带宽占用和延迟。
  • 列式存储结合向量化,可减少I/O和CPU周期。

(3)、利用SIMD并行计算

  • 一条指令处理多个数据元素,例如:
    • SSE4.2:128位寄存器可同时处理4个32位整数。
    • AVX-512:512位寄存器可处理16个32位整数。

(4)、降低控制流开销

  • 传统方式:在逐行执行中,条件判断(如if语句)可能导致分支预测失败,破坏CPU流水线,进而引入性能开销。
  • 向量化:向量化执行可以通过批量处理避免频繁的分支判断,降低了分支预测失败的概率。

5、总结

向量是一组连续存储的同类型数据,可以看作是一维数组。它是批量处理实现的基础。

向量化执行是一种对整个向量(而非单个元素)进行操作的计算方式。它通过减少指令开销、利用SIMD指令集、提高缓存命中率等手段,显著提升了查询性能。

向量化执行是ClickHouse实现高性能的核心技术,其核心思想是批量处理数据并利用SIMD指令并行计算。通过将数据划分为向量(数据块),ClickHouse显著减少了函数调用次数、优化了CPU缓存使用,并充分利用了现代CPU的SIMD能力。与传统行式执行相比,向量化在分析型查询(如过滤、聚合、排序)中性能提升可达 10-100倍,尤其适用于海量数据的OLAP场景。

关键点

  • 向量 = 数据块 + SIMD并行
  • 优势 = 减少开销 + 缓存优化 + 硬件加速
  • 适用场景 = 列式存储 + 分析查询

逆风翻盘,Dare To Be!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python PDF 转 Markdown 工具库对比与推荐

根据最新评测及开源社区实践,以下为综合性能与适用场景的推荐方案: 1. ‌Marker‌ ‌特点‌: 转换速度快,支持表格、公式(转为 LaTeX)、图片提取,适配复杂排版文档‌。依赖 PyTorch&#xff0c…

Vue 和 Spring boot 和 Bean 不同生命周期

一、Vue 组件生命周期 父子组件生命周期顺序: 创建时: 父 beforeCreate → 父 created → 父 beforeMount → 子组件生命周期 → 父 mounted 更新时: 父 beforeUpdate → 子组件更新 → 父 updated。 销毁时: 父 beforeDestroy…

Microsoft Azure 基础知识简介

Microsoft Azure 基础知识简介 已完成100 XP 2 分钟 Microsoft Azure 是一个云计算平台,提供一系列不断扩展的服务,可帮助你构建解决方案来满足业务目标。 Azure 服务支持从简单到复杂的一切内容。 Azure 具有简单的 Web 服务,用于在云中托…

C语言链接数据库

目录 使用 yum 配置 mysqld 环境 查看 mysqld 服务的版本 创建 mysql 句柄 链接数据库 使用数据库 增加数据 修改数据 查询数据 获取查询结果的行数 获取查询结果的列数 获取查询结果的列名 获取查询结果所有数据 断开链接 C语言访问mysql数据库整体源码 通过…

【Maven】手动安装依赖到本地仓库

【Maven】手动安装依赖到本地仓库 【一】下载依赖【二】安装 JAR 文件到本地仓库【三】验证安装【四】在项目中使用该依赖【1】注意事项【2】额外提示 【一】下载依赖 登录到中央仓库下载依赖,中央仓库地址:https://mvnrepository.com/ 搜搜你的依赖的a…

腾讯云golang一面

go垃圾回收机制 参考自:https://zhuanlan.zhihu.com/p/334999060 go 1.3 标记清除法 缺点 go 1.5 三色标记法 屏障机制 插入屏障 但是如果栈不添加,当全部三色标记扫描之后,栈上有可能依然存在白色对象被引用的情况(如上图的对象9). 所以要对栈重新进行三色标记扫…

跨平台嵌入式音视频开发指南:EasyRTC音视频通话的多场景适配与AI扩展能力

在数字化通信技术飞速发展的今天,实时音视频通信已成为众多智能设备和应用的核心功能。从智能家居到远程办公,从在线教育到智能安防,音视频通信技术的应用场景不断拓展,对低延迟、高稳定性和跨平台兼容性的需求也在持续增长。在这…

Android 11 去掉性能受到影响通知

源码位置: frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java final void finishBooting() {TimingsTraceAndSlog t = new TimingsTraceAndSlog(TAG + "Timing",Trace.TRACE_TAG_ACTIVITY_MANAGER);t.traceBegin("Finis…

Mac idea WordExcel等文件git modify 一直提示修改状态

CRLF LF CR 换行符自动转换问题 查看状态:git config --global --list Mac需要开启,window下需要关闭 关闭命令:git config --global core.autocrlf false 命令解释: autocrlf true 表示要求git在提交时将crlf转换为lf&a…

Apache Commons CLI 入门教程:轻松解析命令行参数

文章目录 Apache Commons CLI 入门教程:轻松解析命令行参数一、什么是 Commons CLI?二、为什么选择 Commons CLI?三、快速开始1. 添加依赖2. 基础示例3. 运行示例1. 在Idea中运行2. 命令行中运行3. 使用 Maven/Gradle 运行(推荐&a…

VS2022调试嵌入式linux C# 程序 高效的开发方案

1.目标板子配置好ssh,确保PC可以连上 2.目标板子上传VSDBG程序,详见我的上一个文章 3.PC安装winfsp, sshfs,SSHFS-Win Manager.傻瓜式安装,将目标板子映射到PC的某个盘 4.VS2022中,你的工程的exe生成目录到上面盘中某个路径 5…

Python中如何加密/解密敏感信息(如用户密码、token)

敏感信息,如用户密码、API密钥、访问令牌(token)、信用卡号以及其他个人身份信息(PII),构成了现代应用程序和系统中最为关键的部分。这些信息一旦被未经授权的第三方获取,可能引发灾难性的后果,从个人隐私泄露到企业经济损失,甚至是大规模的社会安全问题。保护这些敏感…

智能体开发的范式革命:Cangjie Magic全景解读与实践思考

引言:当智能体开发遇见仓颉魔法 在人工智能技术日新月异的今天,智能体(Agent)开发正从实验室走向产业应用的核心舞台。2025年3月,仓颉社区推出的Cangjie Magic开源平台,以其创新的设计理念和技术架构,为这一领域带来了…

【Java学习笔记】位运算

位运算 一、原码,反码,补码 (1) 二进制的最高位是符号位:0 表示正数,1 表示负数(怎么记? 1旋转一下变成-) (2) 正数的原码、反码、补码都一样(三码合一) (3) 负数的反码…

HttpSessionBindingListener 的用法笔记250417

HttpSessionBindingListener 的用法笔记250417 HttpSessionBindingListener 是 Java Servlet 规范中 唯一 由 被存储对象自身实现 的会话监听接口, 1. 核心功能 HttpSessionBindingListener 是一个由 会话属性对象自身实现 的接口,用于监听该对象被绑定…

【HDFS入门】HDFS高可用性与容错机制深度解析

目录 引言 1 HDFS高可用架构实现 1.1 基于QJM的NameNode HA架构 1.2 QJM vs NFS实现对比 2 故障切换流程与ZooKeeper作用 2.1 自动故障转移流程 2.2 状态转换机制 3 数据恢复与副本管理 3.1 DataNode故障处理流程 4 快照与数据保护机制 4.1 HDFS快照架构 4.2 快照使…

04-libVLC的视频播放器:获取媒体信息

libvlc_media_t* libvlc_media_player_get_media(libvlc_media_player_t* p_mi); 功能说明 核心作用:获取与媒体播放器关联的当前媒体对象返回值:成功:返回libvlc_media_t*指针失败/无关联媒体:返回NULL内存管理:返回的媒体对象引用计数会增加,需要使用libvlc_media_rele…

使用datax通过HbaseShell封装writer和reader同步hbase数据到hbase_踩坑_细节总结---大数据之DataX工作笔记008

最近在做大数据相关功能,有个需求,使用datax同步hbase到hbase中,其中还是有很多细节值得记录: 首先来看一下datax的源码中,如果你使用phoenix创建的表,那么 你就需要使用对应的hbase带有sql字样的,reader和writer. 然后如果你使用datax-web来进行测试的,那么,他默认使用的是h…

如何通过window端来ssh连接本地虚拟机的ubuntu

首先在 Ubuntu 虚拟机上安装和配置 SSH 服务: # 安装 SSH 服务器 sudo apt update sudo apt install openssh-server# 检查 SSH 服务状态 sudo systemctl status ssh# 如果没有启动,则启动 SSH 服务 sudo systemctl start ssh# 设置开机自启动 sudo sys…

Anolis OS 8.10 发布:软硬协同优化,满足多行业实际应用需求

引言 龙蜥操作系统 Anolis OS 8 是 OpenAnolis 龙蜥社区发行的开源 Linux 发行版,支持多计算架构,提供稳定、高性能、安全、可靠的操作系统支持。Anolis OS 8.10 是 Anolis OS 8 发布的第六个小版本,通过软硬协同,不断完善生态&a…