即时编译助力人大金仓KES分析能力飞跃

news2024/9/24 22:24:48

e9c59ec76e673b273979a7dab3a96b48.gif

随着数字化技术对各行各业的不断渗透,人大金仓在金融、能源、电信等行业逐步进入深水区,面临越来越多的核心类系统改造升级,这些系统不仅需要满足在线交易系统运行的高实时性要求,还需要保证高效分析能力以帮助客户进行业务决策。

数据库中SQL表达式及PLSQL代码实现的都是通用逻辑,这就导致在语句执行过程中可能形成大量不必要的逻辑跳转和代码分支遍历,进而成倍甚至成指数级增加底层指令的执行,造成CPU过高压力。尤其在较为复杂分析类计算场景中,这种性能损耗尤其严重。

为了解决这种无效性能损耗,KES使用动态编译(Just-in-time compilation,JIT)技术,将代码扁平化执行。简单说就是通过直接调用对应的函数,并且在已知输入情况下精简代码逻辑分支的方式,在复杂计算的分析场景下显著降低CPU单位负载压力,有效提高数据库整体性能。

什么是JIT

在解释JIT之前,我们先来了解下什么是编译器:它是将高级语言源代码翻译成机器语言(或翻译成比原始程序低级代码)的程序。

  • 从“代码”到“代码”的转换:

5d830030d08249c368b129e0ea7f235e.png

  • 转换后的代码:

    -计算机可以直接执行的机器语言(本机代码);

    -比原始程序低级的中间语言代码。

在以前,程序通常有两种编译运行方式 - 静态编译与动态直译,现如今又出现了即时编译方式。

1、提前 (Ahead-of-Time: AOT) 编译 - 即静态编译:在运行应用程序之前预编译应用程序的编译。

典型代表:C

-将源代码 (.c) 转换为机器语言(本机代码);

-建二进制文件;

48ba35e289aa266069c08eb13cf182a8.png

2、解释器(interpreter)- 动态直译:执行以编程语言编写的源代码或中间表达式并按顺序解释它们的程序。

典型代表:JAVA-JVM

-代码“在解释的同时执行”;

-优点是无需事先编译,程序独立于特定架构;

-缺点是运行性能低。

3、即时 (JIT) 编译:在软件执行期间编译代码以提高执行速度的编译器;

JAVA

-在运行时将频繁执行的方法编译为机器代码;

352fafc1fa9898cc1041fa34c79c197c.png

Python + Numba

-在运行时编译并运行指定函数。

即时 (JIT) 编译融合了前二种编译方式,一句一句编译源代码执行,同时将编译过的代码缓存起来以降低性能损耗。相对于静态编译,即时编译的代码可以处理延迟绑定并增强安全性。简单的说,JIT 是一种提高程序运行效率的方法。

KES如何实现JIT

KES基于LLVM实现JIT特性。

TIPS

LLVM是一种构建编译器的基础框架系统,以C++实现,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time)。它最早是以C/C++为实现对象,目前它支持了更多编程语言。LLVM 的命名最早源自于底层虚拟机(Low Level Virtual Machine)的首字字母缩写。它提供了一种在程序运行时编译执行代码的可行的程序框架,它对外提供API,使实现JIT变得更加简单。

15147668264a2b2e14abeaf311d83aac.png

KES把对应的JIT 的提供者封装成一个依赖库,从而避免了JIT 对内核代码的侵入性。用户可以按需开启或关闭JIT功能;通过进一步的抽象,KES还提供支持后期扩展不同JIT的解决方案。其JIT实现过程概述如下:

1

表达式的中间表示(Exprstate)转换为LVMM的中间表示(LVMM IR);

2

使用LVMM进行JIT编译,转换为机器代码;

3

KES执行器将其做为内部函数调用执行;

929b8d07d6da001217fe09012ac5e7b1.png

KES基于JIT提供的优化项

1、表达式计算优化

针对WHERE 条件判断、聚合运算等场景实时将表达式的路径编译为具体代码执行,在此过程中大量的不必要的调用和分支跳转会被优化掉。

2、存取层优化

数据库执行器通过存取层装载数据,针对特定的表结构,可以定制读取和解析元组的代码。如在解析元组的流程中,根据表结构动态生成的代码,无需做数据类型的重复判断,只按照顺序解析数据;以及在获取部分列时实现直接根据对应偏移量提取的数据,跳过不需要提取的列,从而降低计算及I/O开销。随着处理的数据量的增加,节省的计算及I/O量将是惊人的。

3、执行器流程优化

LLVM中实现了对产生的中间表示代码(IR)的优化,这一定程度上也会提升数据库查询的执行速度。从每一行数据的处理优化提升到整条 SQL 的处理流程优化:从传统的相对低效的流水线执行方式调整为循环批量处理方式,从而充分利用 CPU缓存,尽量避免去相对慢得多的内存中存取数据;再结合 CPU 向量计算相关指令集,进一步提高性能。

JIT会提升CPU密集型查询的性能,而对于短查询的优化有限,KES默认开启动态编译(JIT),运行时会比较查询的评估代价与JIT代价阀值的大小,判断是否执行JIT编译。用户也可以根据业务需要主动设置JIT参数关闭动态编译。

JIT优化性能实测

下面通过一个客户业务分析场景的脱敏简化版对比说明JIT对SQL执行性能的提升:

CREATE FUNCTION f100000000() RETURNS SETOF bigint

  ROWS 100000000 LANGUAGE sql AS $$

  SELECT g FROM generate_series(1::bigint,  

  100000000::bigint) AS g; 

$$;

-- 11个函数和算⼦,三个地⽅的分配 * 1亿次循环 -> JIT开始起效;

SELECT g, 'X is "' || random() * pi() *

    substr((g * ln(g::float8 + g / 2))::text, 1, 5)::float8 || '"'

FROM f100000000() AS g;

37ade981a8e7b0b585c90e7906aa5e98.png

EXPLAN ANALYZE结果:

Function Scan on f100000000 g (cost=0.25..5750000.25 rows=100000000 width=40)

(actual time=22073.673..233385.687 rows=100000000 loops=1)

Planning Time: 0.255 ms

JIT:

Functions: 2     -- 创建的函数数量

Options: Inlining true, Optimization true, Expressions true, Deforming true       -- 实施的JIT处理

Timing: Generation 1.926 ms, Inlining 5.988 ms, Optimization 36.134 ms,

           Emission 20.168 ms, Total 64.215 ms       -- JIT处理所需时间

Execution Time: 236383.943 ms

(7 rows)

总结展望

JIT可以帮助KES数据库优化SQL执行逻辑,加快复杂SQL的查询速度,从而提升KES整体性能。在TPC-H等数据库测试中,KES的JIT编译表达式执行速度快了不止20%;在JIT模式下,创建索引的速度普遍可以提高5%-19%。

作为国内成立最早、底蕴最深的数据库国家队,人大金仓始终以用户为中心,致力于提供卓越的数据库产品与服务。金仓人在广泛关注及学习前沿技术的同时,坚持自主创新,不断落地新理论,融合新技术,以满足日趋多元且极致的新需求,提升产品核心竞争力,持续为千行百业数字化转型升级赋能。

6dc71ec328549272b4aa771e16905442.png

供稿:技术服务中心

编辑:四喜

校对:日尧

77051abab3907c02f7ffdf2717995907.gif

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

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

相关文章

红米pro14笔记本系统故障怎么U盘重装系统?

红米pro14笔记本系统故障怎么U盘重装系统?今天和大家一起来分享如何使用U盘重装系统的方法分享。有用户的红米pro14笔记本系统出现了一些问题需要进行重新安装,那么今天我们就一起来分享看看怎么U盘重装系统的方法吧。 准备工作: 1、U盘一个&…

Java执行Linux命令死锁阻塞挂起,Runtime.getRuntime().exec阻塞卡死问题解决

1、前言: 最近在做一个需求需要调用linux下的ffmpeg来对处理视频,很简单的需求,我像往常一样写下如下的代码片段: Process process Runtime.getRuntime().exec(cmd); process.waitFor(); But当我运行代码时,发现代码执…

前端笔记 ---- document.execCommand 函数整理

1. 语法 使用语法 bool document.execCommand(aCommandName, aShowDefaultUI, aValueArgument)返回值 一个 Boolean ,如果是 false 则表示操作不被支持或未被启用。 备注: 在调用一个命令前,不要尝试使用返回值去校验浏览器的兼容性 2. 参…

基于Vue和SpringBoot的宾馆管理系统的设计和实现

作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue、SpringBoot和微信小程序)、系统定制、远程技术指导。CSDN学院、蓝桥云…

树形结构——红黑树

前言 在 JDK1.8 之后,HashMap 的底层是由数组、链表、红黑树来实现的,当数组长度到 64 的时候,或者链表长度到 8 的时候,会调用 treeifyBin 转换为红黑树实现。因为红黑树是小伙伴们面试的时候经常被考到的知识点,因此…

OSPF-MGRE实验

1.首先配ip [r6]int g 0/0/1 [r6-GigabitEthernet0/0/1]ip add 192.168.1.2 24 [r6-GigabitEthernet0/0/1]int g 0/0/0 [r6-GigabitEthernet0/0/0]ip add 192.168.2.2 24 [r6-GigabitEthernet0/0/0]int g 0/0/2 [r6-GigabitEthernet0/0/2]ip add 192.168.3.2 24 [r6-GigabitEt…

git pull 和git fetch

1.git fetch 用户一:本地初始化项目,创建文件,保存本地仓库,提交远程仓库 $ git init $ touch file.txt $ git add . $ git commit -m "创建了file.txt文件" [master (root-commit) 4dcee36] 创建了file.txt文件1 file …

简单又好用的财务分析工具有哪些?

什么样的财务分析工具才能算是简单又好用?是能够快速完成组合多变的财务指标运算分析;能够充分发挥企业经营健康晴雨表作用,反映企业财务健康状态;还是能够支持多维度动态分析、自助分析;或者是轻松合并账套&#xff0…

跨域与JSONP

1、同源策略 1.1、什么是同源 如果两个页面的协议,域名和端口都相同,则两个页面具有相同的源。 例如,下表给出了相对于 http://www.test.com/index.html 页面的同源检测: URL 是否同源 原因 http://www.test.com/other.html…

智慧图书馆中的“智慧”体现在哪些方面?

在信息时代背景下,各个领域都发生了巨大变革,图书馆也不例外,开始逐步向着现代化方向发展。传统图书馆存在较多的缺陷,已经无法满足人们的借阅需求,引进信息化技术,打造智慧图书馆是目前图书馆的必然发展趋…

Linux学习记录——오 vim基本知识

** Linux开发工具 ** Linux开发工具——vim vim最小集 vim是一个多模式编辑器,vi也一样,但vim兼容了vi的所有指令,还有一些独有的特性,本篇只针对vim展开。vim有各种模式,每个模式的用法都有差别,模式…

【数据在内存中的存储】肝货满满

前言 我们知道在C语言中的基本内置类型: char //字符数据类型short //短整型int //整形long //长整形long long //更长的整形float //单精度浮点型double //双精度浮点型 那么这些类型是如何存储的呢? 回顾指针类型: *int pi*char pc*float…

String的讲解(Java系列9)

目录 前言: 1.String 1.1字符串的构造 1.2Sting对象的比较 1.3字符串的查找 1.4字符串的转化 1.4.1数值和字符转换 1.4.2大小写转换 1.4.3字符串转数组 1.4.4格式化 1.5字符串的替换 1.6字符串拆分 1.7字符串截取 1.8字符串去空格 1.9字符串的不可变…

Matplotlib笔记 · 绘图区域的结构和子图布局与划分(figure, axes, subplots)

文章目录1. 绘图区域的结构2. subplot系方法 ( subplot布局 )2.1 使用 add_subplot(nrows, ncols, index) 逐一创建子图2.2 控制子图大小和位置 ( add_subplot(nrows, ncols, index) 参数详解 )2.3 使用 subplots(nrows, ncols) 批量创建多张子图3. axes系方法 ( axes布局 )3.1…

基于张量变换域低秩正则化的图像恢复方法

高光谱图像、磁共振图像、RGB图像等都可以表示成三维数组的形式,在数学上将这种多维数组称为高阶张量,同样,上述三种图像都可以表示成三阶张量。在空间上,图像本身就具有结构相似性,在高光谱图像的第三个模态上&#x…

日志分析工具

iis、windows日志做日志分析比较麻烦,这里找到了一款好用的免费的日志分析工具 Log Parser Lizard,下载这个工具之前建议先安装LogParser虽然他会自动弹窗提示。 1. 安装软件 安装没什么好说的一直下一步下一步就行 启动之后点击OK 弹出激活页面让激活…

mod函数怎么取模

mod 是 MySQL 中的数值函数,写法为:mod(x,y),意思是返回x/y的取模的值。 什么是取模?取模就是取余数。 ① 如果第一个值比第二个值大,我整理出来的取模公式就是:第一个值-第一个值里面包含了几个第二个值相…

MATLAB-多边形填充图绘制

fill函数用于绘制并填充二维多边图形。将数据点视为多边形顶点,并将此多边形涂上颜色,便于用户理解图形中的数据代表的含义。具体调用方法如下:fill(X, Y,C):用X和Y中的数据生成多边形,用C指定颜色填充。其中C为色图向量或矩阵。若C是行向量&…

商标注册流程有什么步骤

​一、商标注册流程有什么步骤? 商标注册流程: 1、需要企业提供营业执照副本复印件和商标样稿及主要商品或服务,递交商标局; ​ 2、商标局形式审查(7-15个工作日)接到《商标注册申请受理通知书》; 3、商标局实质审查(5-8个月左右); 4、商标公告(3…

【Linux多线程编程】3. 多线程共享资源

回顾 上篇文章【Linux多线程编程】2.线程创建与回收 简单介绍了如何创建一个线程并且回收它,末尾给出了如下这段代码,本文将从这段代码入手介绍线程资源、线程共享资源、线程独占资源,并在最后引出多线程安全访问资源的方法。 /** test_pth…