ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第三十一章 即时编译

2021-03-09 14:57:29  阅读:178  来源: 互联网

标签:jit rows cost .. 即时 编译 JIT 第三十一章 ms


本章介绍何为即时编译以及如何在PostgreSQL进行配置。

31.1 何为即时编译

即时(Just-In-Time,JIT)编译是将某种形式的解释程序计算转变成原生程序的过程,并且这一过程是在运行时完成的。例如,与使用能够计算任意SQL表达式的通用代码来计算一个特定的SQL谓词(如WHERE a.col = 3)不同,可以产生一个专门针对该表达式的函数并且可以由CPU原生执行,从而得到加速。

 

PostgreSQL对即时编译有使用LLVM的内置支持,不过需要在构建时使用--with-llvm选项。

 

更多细节,请参见src/backend/jit/README。

31.1.1 JIT可加速的操作

当前,PostgreSQL的JIT支持对表达式计算以及元组拆解的加速。

31.1.2 内联

即时编译可以把小函数的函数体内联到使用它们的表达式中。

31.1.3 优化

LLVM支持对生成的代码进行优化。

31.2 何时使用JIT

即时编译对运行时间较长的CPU密集型的查询益处更大。是否使用JIT,取决于总成本与jit_above_cost的对比,若前者高于后者,则进行JIT编译。

 

可使用EXPLAIN命令查看是否使用了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 ms

Execution Time: 0.365 ms

(4 rows)

使用了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 ms

JIT:

Functions: 3

Options: Inlining false, Optimization false, Expressions true,Deforming true

Timing: Generation 1.259 ms, Inlining 0.000 ms, Optimization

0.797 ms, Emission 5.048 ms, Total 7.104 ms

Execution Time: 7.416 ms

31.3 配置

jit参数控制是否开启jit。如果启用jit,则jit_above_cost,jit_inline_above_cost,jit_optimize_above_cost控制是否对查询启用jit。

31.4 可扩展性

31.4.1 对扩展的内联支持

可内联C和internal及基于此的函数体。

31.4.2 可拔插的JIT提供者

PostgreSQL提供基于LLVM的JIT。提供给JIT提供者的界面为可拔插的,提供者可在不用重新编译的情况下对其进行更改。可用提供者使用jit_provider限定。

31.4.2.1 JIT提供者界面

JIT提供者通过动态加载命名库加载。 为了提供所要求的JIT提供者回调并且表示该库实际上是一个JIT提供者,它需要提供一个名为_PG_jit_provider_init的C函数。

struct JitProviderCallbacks
{
JitProviderResetAfterErrorCB reset_after_error;
JitProviderReleaseContextCB release_context;
JitProviderCompileExprCB compile_expr;
};


extern void _PG_jit_provider_init(JitProviderCallbacks *cb);

 

标签:jit,rows,cost,..,即时,编译,JIT,第三十一章,ms
来源: https://blog.csdn.net/ghostliming/article/details/114582869

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有