PostgreSQL 11 - with_llvm

背景

PostgreSQL 11 LLVM JIT,目前支持tuple deform(将磁盘上的tuple转换为内存中TUPLE格式),以及表达式(select, where, 等语义中的表达式,操作符运算,UDF等)的动态编译。

对海量数据的计算(并且表达式或TUPLE DEFORM已成为瓶颈时)有加速效果。

在2016年,俄罗斯国家科学院系统编程研究所(Institute for System Programming of the Russian Academy of Sciences ,简称ISPRAS)就研究使用LLVM JIT编译器技术来提升PostgreSQL的查询执行效率,并居于postgresql 9.6发布了LLVM专版。

https://github.com/ispras/postgres

PostgreSQL官方发布PostgreSQL 11,正式整合 llvm JIT 查询优化技术。

Currently PostgreSQL's JIT implementation has support for accelerating expression evaluation and tuple deforming. Several other operations could be accelerated in the future.

Expression evaluation is used to evaluate WHERE clauses, target lists, aggregates and projections. It can be accelerated by generating code specific to each case.


优化场景

1、需要处理的数据量庞大

2、每条记录需要大量的操作符参与计算

3、需要查询的字段靠后,需要先deform tuple中前面的字段

也就是OLAP数据分析处理场景,因为这些场景中,CPU计算效率形成瓶颈比磁盘I/O还要严重。

优化分析过程

PostgreSQL的优化器通过构建树的方式来表述执行计划,所以执行器必须以递归的方式从树的最边缘节点一直往上执行。解释执行的好处是弹性,容易改写。

但是,通常解释执行比native code慢10倍,特别是在表达式非常多时。

使用JIT(just in time)编译器,生成query的native code,从而提高大批量数据处理的效率。

以下是ISPRAS列举的一个数据分析查询例子:

统计分析过程

采用解释执行器执行查询树


解释执行器

针对性优化手段是尽量的减少函数切换,使用LLVM的接口可以帮你将这个部分的代码重新生成,在一个函数内完成所有的运算。


llvm JIT

使用直接动态生成可执行代码代理递归解析执行查询树过程,优化了Filter执行效率。


执行代码代替解析执行器


动态生成可执行代码

动态生成可执行代码1


动态生成可执行代码2

LLVM优化代码过程


LLVM优化代码过程

经过多轮优化,提升执行效率。

对大量数据分析的分析处理,filter或select clause的表达式越多的情况,效果越明显。

优化结果:

测试数据的结构包括32个字段,1亿条记录(阿里的测试数据:https://yq.aliyun.com/articles/66945)


另外,一般数据库支持的数据类型就有几十上百,每种数据类型都有几十上百的算子,所以说改造的工作量是非常庞大的。PostgreSQL 11已经集成 llvm 技术,避免集成llvm消耗工作量。

进一步优化

LLVM 可以提升执行效率,但是对于数据读取和解析没有并没有优势。

如果想进一步,可以采用列式存储。列式存储可以有效的提升数据压缩率,在分析查询时,避免读取冗余列,有效降低内存和磁盘I/O消耗。同时还可以和LLVM搭配使用,做到多核并行处理数据,甚至是使用现代CPU的复杂指令SIMD(Single Instruction Multiple Data)单指令计算多个数据,提升处理性能。



总结

LLVM JIT技术改造工作量大,但对聚合查询和复杂表达式的执行效率有明显提升,适合OLAP使用场景。

在OLTP场景中,对insert、update、delete没有提升作用。如果加上列式存储技术,还会降低insert、update、delete的效率。



由于时间关系,没有另行做测试分析对比

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容