@[TOC](PostgreSQL Just-in-Time Compilation(JIT))

什么是just-in-time,在PostgreSQL里怎么配置。

What is JIT compilation?

Just-in-Time (JIT)编译是在运行时把解释型程序转换成原生程序的过程。例如,不使用可以评估任意SQL的通用代码来评估特定的谓词(比如WHERE a.col),而是生成一个特定的,能被CPU原生执行的该表达式的函数,来加速。
当构建PostgreSQL的时候使用了 --with-llvm选项,PostgreSQL使用LLVM 1支持JIT编译。
更多细节请参考 src/backend/jit/README。

JIT Accelerated Operations

现在,PostgreSQL的JIT实现已经支持加速表达式评估和tuple deforming。未来将支持更多算法。
表达式评估用来评估WHERE clauses、target lists、aggregates和projections。每种情况下都可以生成代码提高速度。
Tuple deforming是把磁盘元组(tuple)转换成内存表示的过程。它根据table layout和被提取的列的数量生成函数来加速。

Inlining

PostgreSQL的扩展性非常好,且允许新的数据类型、函数、运算符和其他数据库对象。事实上,内建的对象也是使用类似的机制实现的。这种扩展性意味着一些开销,例如由于函数调用。为了减少这些开销,JIT编译器在表达式中内联小函数体。这样可以优化相当多的开销。

Optimization

LLVM支持优化生成的代码。一些优化是足够廉价的,只要开启了JIT就会执行,而其他的只有在慢查询时才有利。优化的细节请见transform-passes

When to JIT?

JIT编译主要在长时间运行的CPU密集的查询时有利。通常,这些都是分析性的查询。对于短查询,执行JIT编译的开销经常高于它能节省的时间。
使用一个查询的总的评估代价(total estimated cost),决定是否使用JIT编译。查询的评估代价和jit_above_cost配置做比较。如果代价高,就执行JIT编译。还需要做出另外两个决定。首先,如果评估代价大于jit_inline_above_cost的设置,查询中的短函数和运算符将是内联的。其次,如果评估代价大于jit_optimize_above_cost的设置,就使用昂贵的代价改进生成的代码。这些选项都增加了JIT编译的开销,但是减少了查询执行时间。
这些基于代价的决定,会在计划时间(plan time)执行,而不是在执行时间。这意味着当使用PrepareStatement的时候,执行一个通用的计划。配置参数的值在准备时间(prepare time)控制决定。

注意:如果关闭jit,或者如果JIT编译无效(例如因为服务器没使用–with-llvm选项编译)。JIT将不会执行,甚至在根据上面的规则判断有利的情况下也不执行。关闭jit会影响计划和执行时间。

使用EXPLAIN,可以知道是否使用了JIT。下面的例子,就没有使用JIT:

=# EXPLAIN ANALYZE SELECT SUM(relpages) FROM pg_class;
QUERY PLAN
--------------------------------------------------------------------------------
Aggregate (cost=16.27..16.29 rows=1 width=8) (actual time=0.303..0.303 rows=1 loops=1)-> Seq Scan on pg_class (cost=0.00..15.42 rows=342 width=4)(actual time=0.017..0.111 rows=356 loops=1)Planning Time: 0.116 msExecution Time: 0.365 ms(4 rows)

考虑到计划的代价,不使用JIT是完全合理的;JIT的代价大于潜在的节省。调整代价限制将导致JIT的使用:

=# SET jit_above_cost = 10;
SET
=# EXPLAIN ANALYZE SELECT SUM(relpages) FROM pg_class;
QUERY PLAN
--------------------------------------------------------------------------------
Aggregate (cost=16.27..16.29 rows=1 width=8) (actual time=6.049..6.049 rows=1 loops=1)-> Seq Scan on pg_class (cost=0.00..15.42 rows=342 width=4)(actual time=0.019..0.052 rows=356 loops=1)Planning Time: 0.133 msJIT:Functions: 3Options: Inlining false, Optimization false, Expressions true,Deforming trueTiming: Generation 1.259 ms, Inlining 0.000 ms, Optimization 0.797 ms, Emission 5.048 ms, Total 7.104 msExecution Time: 7.416 ms

上面的例子使用了JIT,但是,没做内联和昂贵的优化。如果jit_inline_above_cost或者jit_optimize_above_cost也设置得小一些,就会执行。

Configuration

配置变量jit决定打开还是关闭JIT编译。如果打开jit,配置变量jit_above_cost、jit_inline_above_cost和jit_optimize_above_cost,决定某查询是否执行JIT编译,以及花费的代价是多少。jit_provider决定使用哪个JIT编译,它一般不需要修改。
此外,还有一些开发和调试目的的附加配置参数,见19.17。

Extensibility

Inlining Support for Extensions

PostgreSQL的JIT编译能内联C函数或内部函数的函数体,就像操作符基于的那些函数。函数要实现这样的扩展,那些函数的定义需要有效。当使用PGXS在支持JIT的服务器build一个扩展,相应的文件将被build并且自动安装。
相应的文件将被安装到pkglibdir/bitcode/pkglibdir/bitcode/pkglibdir/bitcode/extension/,他们的摘要也被安装到pkglibdir/bitcode/pkglibdir/bitcode/pkglibdir/bitcode/extension。
pkglibdir是由pgconfig−−pkglibdir返回的目录,pkglibdir是由pg_config --pkglibdir返回的目录,pkglibdir是由pgc​onfig−−pkglibdir返回的目录,extension是扩展的共享库的基本名(base name)。

注意:对于PostgreSQL内置的函数,bitcode将被安装在$pkglibdir/bitcode/postgres。

Pluggable JIT Providers

PostgreSQL提供了基于LLVM的JIT编译。JIT提供者的接口是可插拔的,不用重新编译就可以修改提供者(但是,目前build过程只提供LLVM的内联支持)。设置jit_provider可选择实际的提供者。

JIT Provider Interface

JIT提供者通过可动态加载的共享库加载。通过通用的库搜索路径定位库。为了提供需要的JIT提供者回调,为了表明该库是实际上的JIT提供者,需要有一个C函数名PG_jit_provider_init。该函数传递一个struct,其中包括每个动作的回调函数指针:

struct JitProviderCallbacks {JitProviderResetAfterErrorCB reset_after_error;JitProviderReleaseContextCB release_context;JitProviderCompileExprCB compile_expr;
};extern void _PG_jit_provider_init(JitProviderCallbacks *cb);

PostgreSQL JIT编译相关推荐

  1. PostgreSQL JIT(Just-In-Time Compilation)With LLVM 的实现原理

    文章目录 前言 LLVM LLVM 编译 LLVM 基本架构 LLVM IR LLVM IR两种磁盘文件的生成方式 LLVM IR .ll 文件 语法形态 LLVM IR in-memory 表示形式 ...

  2. 【Java】实战Java虚拟机之五“开启JIT编译”

    今天开始实战Java虚拟机之五"开启JIT编译" 总计有5个系列 实战Java虚拟机之一"堆溢出处理" 实战Java虚拟机之二"虚拟机的工作模式&qu ...

  3. javac 编译与 JIT 编译

    javac 编译与 JIT 编译 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块 ...

  4. 66.javac 编译与 JIT 编译\编译过程\javac 编译\词法、语法分析\填充符号表\语义分析\字节码生成\JIT 编译

    66.javac 编译与 JIT 编译 66.1.编译过程 66.2.javac 编译 66.2.1.词法.语法分析 66.2.2.填充符号表 66.2.3.语义分析 66.2.4.字节码生成 66. ...

  5. java全jit编译_JVM即时编译(JIT)(转载)

    原文出处:https://blog.csdn.net/sunxianghuang/article/details/52094859 什么是JIT 1.动态编译(dynamic compilation) ...

  6. 关于 .NET 与 JAVA 在 JIT 编译上的一些差异

    最近因为公司的一些原因,我也开始学习一些 JAVA 的知识.虽然我一直是以 .NET 语言为主的程序员,但是我并不排斥任何其它语言.在此并不讨论 JAVA .NET 的好坏,仅仅是对 .NET 跟 J ...

  7. jit编译_意外分配– JIT编译抖动

    jit编译 在研究ByteWatcher时 (请参阅我的上一篇 文章 ),我遇到了一些非常奇怪的事情. 这是实际的代码段,用于找出特定线程上的分配量: return (long) mBeanServe ...

  8. 意外分配– JIT编译抖动

    在研究ByteWatcher时 (请参阅我的上一篇 文章 ),我遇到了一些非常奇怪的事情. 这是实际的代码段,用于找出特定线程上的分配量: return (long) mBeanServer.invo ...

  9. JVM之静态编译优化以及JIT编译

    为什么80%的码农都做不了架构师?>>>    对于执行的字节码会从两处进行优化. 第一,就是使用javac编译时. 第二,就是使用JIT(just-in-time)即时编译,在运行 ...

最新文章

  1. centos7下搭建git和gitlab版本库
  2. python介绍和用途-Python基础介绍(一)
  3. html语言中span,html元素span标签的使用方法及作用
  4. Element-UI-快速入门(极简教程)
  5. 分享WCF文件传输---WCFFileTransfer
  6. 如何用google ads赚钱
  7. String类的对象的方法 格式小结 java 1202
  8. php计算一段时间工作日,PHP计算8小时工作日的一半
  9. java学习日记(1-7)
  10. 洛谷——P2637 第一次,第二次,成交
  11. ultraedit 运行的是试用模式_原来用Unittest框架写接口测试用例这么简单!
  12. 测试家里网速用什么软件,怎么测试网速,测试网速用什么软件
  13. wow模型修改器_wow模型修改器
  14. Android连接mumu模拟器
  15. Word文档检查语法错误及错别字
  16. 第4季2:并口、MIPI、LVDS的简介
  17. 各种编码格式(GB2312,GBK,GB18030,unicode,utf-8)之间的关系
  18. NLI:Natural Language Inference
  19. 玩家的numpertpry 对象 中 不仅仅要同步 君主武将的等级,阶级也要同步
  20. Java(10)面向对象之继承,内部类

热门文章

  1. 复杂系统学习(七):基于代理的模型I
  2. 程序出错,找不到问题在哪?——我给你方法
  3. 可编程计算机控制器课设,可编程控制器课程设计.doc
  4. MES管理系统如何帮助企业实施无缝批次管理
  5. Pixhawk的历史
  6. 怎么用视频编辑软件实现跟踪马赛克效果
  7. java cn.itcast.gjp.tools
  8. 今年一直搞Oracle EBS优化,脑壳痛
  9. sql yog 出现 access denied for user root@localhost 但是密码正确
  10. MP4封装格式介绍 -- Atom结构