数据库浅谈之 LLVM

news2025/8/2 23:56:05

数据库浅谈之 LLVM

HELLO,各位博友好,我是阿呆 🙈🙈🙈

这里是数据库浅谈系列,收录在专栏 DATABASE 中 😜😜😜

本系列阿呆将记录一些数据库领域相关的知识 🏃🏃🏃

OK,兄弟们,废话不多直接开冲 🌞🌞🌞


一 🏠 概述

了解 LLVM

LLVM,一个自由软件项目,是一种编译器的基础建设,底层 C++ 实现

它利用虚拟技术,创造出编译时期,链接时期,运行时期最优化

它目标为所有静态和动态语言创造出动态编译技术,LLVM 源自于底层虚拟机(Low Level Virtual Machine)首字字母缩写

它提供了一种在程序运行时编译执行代码的程序框架


LLVM 特性

1、LLVM 可以在编译时期、链接时期,甚至是运行时期产生可重新定位的代码

2、LLVM 支持与语言无关的指令集架构及类型系统。LLVM 可以提供完整编译器系统的中间层,从编译器获取中间表示(IR)代码并发出优化 IR,然后将新 IR 转换并链接到目标平台的汇编语言代码

使用 LLVM API 会生成中间代码 IR,存放在内存或外部文件中。在目标文件执行,对应平台会再生成机器码执行

这意味着在 IR 层编程,在不同的 CPU 上执行,会在当前硬件平台生成最优机器码

Intel x86,不同代 CPU 优化程度也不同。例如 :LLVM 会充分利用新 CPU 上的指令集,SIMD。这一点在数据仓库做浮点数计算时会用到

3、LLVM API 可用于编码,并生成 LLVM IR 中间代码。支持多种编码语言,C/C++ 均覆盖

4、LLVM 前端编译器 clang 兼容 gcc,且性能相当。相关代码使用编译器 clang 编译,能和 gcc 编译二进制相互链接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JrMRabuG-1677203966765)(E:\2022年MD文档\2023 年 MD文档\二月\数据库浅谈\数据库浅谈之 LLVM.assets\1677138341905.png)]


二 🏠 核心

了解 JIT

Just-In-Time Compiler,是一种动态编译中间代码的方式,根据需要,在程序中编译并执行生成的机器码,能够大幅提升动态语言的执行速度

通常高级语言分为两种 :编译型语言和解释型语言,静态编译(C / C++)程序在执行前全部被翻译为机器码,解释型(JS)则是在执行过程中一句一句边运行边翻译

JIT 混合了这二者,相对于静态编译代码,可以处理延迟绑定并增强安全性

JIT 引擎的工作原理并没有那么复杂,本质上是将原来编译器要生成机器码的部分要直接写入到当前的内存中,然后通过函数指针的转换,找到对应的机器码并进行执行


在数据库领域,单个任务为追求高性能,需尽可能利用整个集群的硬件资源进行计算

分析业务无疑是 CPU 密集型的任务,经常一个任务会调度整个集群的 CPU 满负荷运转几分钟,甚至几小时,提高 CPU 的计算效率是一个通用的性能优化任务

了解数据库内核的博友,实现应该知道后端编码往往是一套通用的数据处理。例如 :实现不同数据类型(定长,变长)组合的表结构读写,但是针对于单条 SQL 却只涉及固定表和列类型。比如 :Select * From Tab (Tab 表,列个数和类型均固定)

那么对于单条 SQL ,很多 变量,已成为 常量 ,如果在已知的条件下写固定代码,必然会去掉很多条件判断等逻辑 ,JIT 技术便可以达成这样的梦想


LLVM 应用

一、优化频繁调用的存取层

数据库执行器通过存取层装载数据,针对特定的表结构,可以定制读取和解析。例 :通常情况下通用解析流程如下,列数据类型不同,进行分支判断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gh9trB2Z-1677203966766)(E:\2022年MD文档\2023 年 MD文档\二月\数据库浅谈\数据库浅谈之 LLVM.assets\1677139657114.png)]

当确定表结构后, 动态生成的代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OpuIQJqw-1677203966766)(E:\2022年MD文档\2023 年 MD文档\二月\数据库浅谈\数据库浅谈之 LLVM.assets\1677139736917.png)]

按照顺序解析数据,而不需数据类型判断,直接获取对应偏移数据,跳过不需要的列,这些都可以简化 CPU 指令。随着处理的行数增加,节省的计算量是惊人的

二、表达式计算

关系数据库,表达式计算基于一套通用框架,表达式求值类似一颗二叉树计算,过程是从叶节点计算到根节点,整个步骤递归执行(表达式越复杂,递归层级越深)

但是在获取到查询计划之后再 动态编译,只需如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RUbHwPXQ-1677203966768)(E:\2022年MD文档\2023 年 MD文档\二月\数据库浅谈\数据库浅谈之 LLVM.assets\1677139908632.png)]

具体优势

1、递归改为顺序执行

2、整个过程一个函数调用完成,性能提高明显

3、去掉分支判断,高效利用 CPU Cache

4、CPU 指令大量减少,高效利用 CPU计算

5、循环展开和 SIMD

使用基于内存计算的 LLVM 技术来提高表达式引擎的计算能力,适用于复杂 SQL 场景下,在任意位置上出现表达式计算场景,提高 CPU 执行效率,显著降低硬件成本


三 🏠 结语

身处于这个浮躁的社会,却有耐心看到这里,你一定是个很厉害的人吧 👍👍👍

各位博友觉得文章有帮助的话,别忘了点赞 + 关注哦,你们的鼓励就是我最大的动力

博主还会不断更新更优质的内容,加油吧!技术人! 💪💪💪

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

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

相关文章

【CJSON】嵌入式芯片上基于USB HOST的CJSON文件库移植与应用

一 CJSON简介项目遇到了一个需求,就是需要通过U盘或者其他外接设备,与板子(嵌入式芯片使用的是LPC1857)进行交互。交互的形式有两种:一种是预存在外接U盘中的配置信息CFG,接上U盘之后,嵌入式芯片…

【HTTP——了解HTTP协议及状态码】

一, 什么是通信通信,就是信息的传递和交换。通信三要素:通信的主体,通信的内容,通信的方式现实生活中的通信:我打电话叫小明来我家吃饭【其中通信的主体是,我,小明。通信内容是&…

华为OD机试题,用 Java 解【最小施肥机能效】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

【AI写作】《如何利用 RPA 实现自动化获客?》

写一篇文章《如何利用 RPA 实现自动化获客?》,不少于3000字,使用markdown格式。分10各章节,细化到3级目录。 文章目录 1. 什么是 RPA (Robotic Process Automation)?RPA 的应用场景2. RPA 自动化获客实战2.1 RPA 应该领域2.2 自动化选品 – 电商选品2.3 自动化获客 – 百…

Biome-BGC在模拟过程中,如何使用Linux、Python等,完成前处理和后处理工作???

在Biome-BGC模型中,对于碳的生物量积累,采用光合酶促反应机理模型计算出每天的初级生产力(GPP),将生长呼吸和维持呼吸减去后的产物分配给叶、枝条、干和根。生物体的碳每天都按一定比例以凋落方式进入凋落物碳库;对于水份输运过程…

【C语言】数据的存储

☃️内容专栏:【C语言】进阶部分 ☃️本文概括: C语言中的数据类型及其存储方式。 ☃️本文作者:花香碟自来_ ☃️发布时间:2023.2.24 目录 一、数据类型详细介绍 1.1 基本的数据类型 1.2 整型家族 1.3 构造类型 1.4 指针类型…

压力传感器MPX5700D/MPX5700GP/MPX5700AP产品概述、特征

MPX5700系列压阻式换能器是最先进的单片硅压力传感器,可广泛用于各种应用,特别是采用A/D输入微控制器或微处理器的应用。这一获得专利的单元件传感器集合了高级微加工技术、薄膜金属化、双极工艺,能够提供精确的、与所施加压力成正比的高电平…

Java面向对象:继承特性的学习

本文介绍了面向对象的继承特性: 什么是继承 继承的概念 Java中继承的语法 在继承下父类成员的访问 super和this关键字 父类和子类构造方法 在继承下类中出现初始化代码的执行顺序 父类成员的访问权限对子类的可见性 Java的继承关系 final关键字 认识继承和组合关系 继承特性的学…

Pytorch学习笔记(7):优化器、学习率及调整策略、动量

目录 一、优化器 1.1 优化器的介绍 1.2 optimizer的属性 1.3 optimizer的方法 1.4 常用优化器 torch.optim.SGD 二、学习率 2.1 学习率介绍 2.2 为什么要调整学习率 2.3 pytorch的六种学习率调整策略 (1)StepLR (2)Mu…

linux:http服务器搭建及实验案例

目录准备工作http服务器各个配置文件大概说明实验1:访问不同ip获得不同网页实验2:同一ip访问不同端口获得不同网页准备工作 1,安装http服务 2,将 /etc/selinux/config 文件下面的 SELINUX值改为 disabled 或者 permissive 。 3&a…

如何基于无代码平台实现60个园区、3万台设备的管理?

产业园区的建设是经济发展的集中承载区域。数字化快速发展迭代趋势下,对于一个全国领先的园区综合建设、运营集团来说,对跨园区的监管服务压力也日益增大。特别是随着全国范围内化工、物流、生产等各业态园区快速建设和扩张,园区内消防、安全…

GSEAmining | 来看看你的GSEA结果是不是需要瘦身啦!~

1写在前面 最近真是累的不行,今天抽空写一下新的教程,关于人人都会做的GSEA(Gene Set Enrichment Analysis)。 但有时候我们做完GSEA后结果实在太多,无法确定其中重要的生物学意义,难以解释。🤨…

Servlet笔记(4):表单数据

1、Servlet表单数据的方法 GET方法 http://localhost/hello?key1value1&key2value2GET方法有大小限制:请求字符串中最多只能由【1024】个字符 这些信息通过QUERY_STRING头传递,并通过【QUERY_STRING】环境变量访问,Servlet通过【doGet(…

SpringCloud - Gateway网关路由

目录 网关初步介绍 搭建网关服务 路由断言工厂Route Predicate Factory 路由过滤器 GatewayFilter 全局过滤器 GlobalFilter 过滤器执行顺序 网关的cors跨域配置 网关初步介绍 不是所有的请求,都能访问服务,所以需要网关对来访问的请求进行提前判…

归并排序及其应用

归并排序算法基于分而治之的概念,具体来说就是遍历一棵树,归并的过程是一个后序执行的动作。 由于我们知道每个子部分在合并后都是有序的,我们可以利用这个特性来解决一些问题。 上图可视化了merge sort algorithm的过程,我们很容…

2023年:我成了半个外包

边线业务与主线角色被困外包; 012022年,最后一个工作日,裁员的小刀再次挥下; 商务区楼下又多了几个落寞的身影,办公室内又多了几头暴躁的灵魂; 随着裁员的结束,部门的人员结构简化到了极致&am…

Fiddler在ios内的app中抓取https的解决方法

1、安装&设置Fiddler 查看链接---->Fiddler对PC浏览器&安卓App抓包的使用和配置 2、配置完后重启fiddler 3、ios安装证书 3.1、在fiddler右上角这里悬浮鼠标,查看自己电脑IP 或者通过: window键R,输入cmd,在命令行…

java Spring JdbcTemplate 准备工作

查看本文之前 您需要先看我 java Spring的IOC和AOP操作作为基础 如果并不掌握 可以找一下我之前的文章 都有讲到过 接下来的 我们将通过 JdbcTemplate 来做一些数据库操作 那我们就需要对 JdbcTemplate 有个基本的概念 首先 JdbcTemplate 是 Spring对 JDBC的一个很好的封装 通…

哪款蓝牙耳机延迟最低?打游戏零延迟的蓝牙耳机

我知道很多朋友会很在意声音延迟问题,虽然现如今蓝牙5.2甚至5.3已经可以几乎做到零延迟,但毕竟无线传输到现在依然存在或多或少延迟的情况出现,尤其是在这种蓝牙设备密集的地方,信号的干扰是不可避免的,由于技术的迭代…

【数据结构】空间复杂度

🚀write in front🚀 📜所属专栏:初阶数据结构 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对…