1 <!-- doc/src/sgml/jit.sgml -->
4 <title>Just-in-Time Compilation (
<acronym>JIT
</acronym>)
</title>
7 <primary><acronym>JIT
</acronym></primary>
11 <primary>Just-In-Time compilation
</primary>
12 <see><acronym>JIT
</acronym></see>
16 This chapter explains what just-in-time compilation is, and how it can be
17 configured in
<productname>PostgreSQL
</productname>.
20 <sect1 id=
"jit-reason">
21 <title>What Is
<acronym>JIT
</acronym> compilation?
</title>
24 Just-in-Time (
<acronym>JIT
</acronym>) compilation is the process of turning
25 some form of interpreted program evaluation into a native program, and
27 For example, instead of using general-purpose code that can evaluate
28 arbitrary SQL expressions to evaluate a particular SQL predicate
29 like
<literal>WHERE a.col =
3</literal>, it is possible to generate a
30 function that is specific to that expression and can be natively executed
31 by the CPU, yielding a speedup.
35 <productname>PostgreSQL
</productname> has builtin support to perform
36 <acronym>JIT
</acronym> compilation using
<ulink
37 url=
"https://llvm.org/"><productname>LLVM
</productname></ulink> when
38 <productname>PostgreSQL
</productname> is built with
39 <link linkend=
"configure-with-llvm"><literal>--with-llvm
</literal></link>.
43 See
<filename>src/backend/jit/README
</filename> for further details.
46 <sect2 id=
"jit-accelerated-operations">
47 <title><acronym>JIT
</acronym> Accelerated Operations
</title>
49 Currently
<productname>PostgreSQL
</productname>'s
<acronym>JIT
</acronym>
50 implementation has support for accelerating expression evaluation and
51 tuple deforming. Several other operations could be accelerated in the
55 Expression evaluation is used to evaluate
<literal>WHERE
</literal>
56 clauses, target lists, aggregates and projections. It can be accelerated
57 by generating code specific to each case.
60 Tuple deforming is the process of transforming an on-disk tuple (see
<xref
61 linkend=
"storage-tuple-layout"/>) into its in-memory representation.
62 It can be accelerated by creating a function specific to the table layout
63 and the number of columns to be extracted.
67 <sect2 id=
"jit-inlining">
68 <title>Inlining
</title>
70 <productname>PostgreSQL
</productname> is very extensible and allows new
71 data types, functions, operators and other database objects to be defined;
72 see
<xref linkend=
"extend"/>. In fact the built-in objects are implemented
73 using nearly the same mechanisms. This extensibility implies some
74 overhead, for example due to function calls (see
<xref linkend=
"xfunc"/>).
75 To reduce that overhead,
<acronym>JIT
</acronym> compilation can inline the
76 bodies of small functions into the expressions using them. That allows a
77 significant percentage of the overhead to be optimized away.
81 <sect2 id=
"jit-optimization">
82 <title>Optimization
</title>
84 <productname>LLVM
</productname> has support for optimizing generated
85 code. Some of the optimizations are cheap enough to be performed whenever
86 <acronym>JIT
</acronym> is used, while others are only beneficial for
87 longer-running queries.
88 See
<ulink url=
"https://llvm.org/docs/Passes.html#transform-passes"/> for
89 more details about optimizations.
95 <sect1 id=
"jit-decision">
96 <title>When to
<acronym>JIT
</acronym>?
</title>
99 <acronym>JIT
</acronym> compilation is beneficial primarily for long-running
100 CPU-bound queries. Frequently these will be analytical queries. For short
101 queries the added overhead of performing
<acronym>JIT
</acronym> compilation
102 will often be higher than the time it can save.
106 To determine whether
<acronym>JIT
</acronym> compilation should be used,
107 the total estimated cost of a query (see
108 <xref linkend=
"planner-stats-details"/> and
109 <xref linkend=
"runtime-config-query-constants"/>) is used.
110 The estimated cost of the query will be compared with the setting of
<xref
111 linkend=
"guc-jit-above-cost"/>. If the cost is higher,
112 <acronym>JIT
</acronym> compilation will be performed.
113 Two further decisions are then needed.
114 Firstly, if the estimated cost is more
115 than the setting of
<xref linkend=
"guc-jit-inline-above-cost"/>, short
116 functions and operators used in the query will be inlined.
117 Secondly, if the estimated cost is more than the setting of
<xref
118 linkend=
"guc-jit-optimize-above-cost"/>, expensive optimizations are
119 applied to improve the generated code.
120 Each of these options increases the
<acronym>JIT
</acronym> compilation
121 overhead, but can reduce query execution time considerably.
125 These cost-based decisions will be made at plan time, not execution
126 time. This means that when prepared statements are in use, and a generic
127 plan is used (see
<xref linkend=
"sql-prepare"/>), the values of the
128 configuration parameters in effect at prepare time control the decisions,
129 not the settings at execution time.
134 If
<xref linkend=
"guc-jit"/> is set to
<literal>off
</literal>, or if no
135 <acronym>JIT
</acronym> implementation is available (for example because
136 the server was compiled without
<literal>--with-llvm
</literal>),
137 <acronym>JIT
</acronym> will not be performed, even if it would be
138 beneficial based on the above criteria. Setting
<xref linkend=
"guc-jit"/>
139 to
<literal>off
</literal> has effects at both plan and execution time.
144 <xref linkend=
"sql-explain"/> can be used to see whether
145 <acronym>JIT
</acronym> is used or not. As an example, here is a query that
146 is not using
<acronym>JIT
</acronym>:
148 =# EXPLAIN ANALYZE SELECT SUM(relpages) FROM pg_class;
150 -------------------------------------------------------------------
&zwsp;------------------------------------------
151 Aggregate (cost=
16.27.
.16.29 rows=
1 width=
8) (actual time=
0.303.
.0.303 rows=
1 loops=
1)
152 -
> Seq Scan on pg_class (cost=
0.00.
.15.42 rows=
342 width=
4) (actual time=
0.017.
.0.111 rows=
356 loops=
1)
153 Planning Time:
0.116 ms
154 Execution Time:
0.365 ms
157 Given the cost of the plan, it is entirely reasonable that no
158 <acronym>JIT
</acronym> was used; the cost of
<acronym>JIT
</acronym> would
159 have been bigger than the potential savings. Adjusting the cost limits
160 will lead to
<acronym>JIT
</acronym> use:
162 =# SET jit_above_cost =
10;
164 =# EXPLAIN ANALYZE SELECT SUM(relpages) FROM pg_class;
166 -------------------------------------------------------------------
&zwsp;------------------------------------------
167 Aggregate (cost=
16.27.
.16.29 rows=
1 width=
8) (actual time=
6.049.
.6.049 rows=
1 loops=
1)
168 -
> Seq Scan on pg_class (cost=
0.00.
.15.42 rows=
342 width=
4) (actual time=
0.019.
.0.052 rows=
356 loops=
1)
169 Planning Time:
0.133 ms
172 Options: Inlining false, Optimization false, Expressions true, Deforming true
173 Timing: Generation
1.259 ms (Deform
0.000 ms), Inlining
0.000 ms, Optimization
0.797 ms, Emission
5.048 ms, Total
7.104 ms
174 Execution Time:
7.416 ms
176 As visible here,
<acronym>JIT
</acronym> was used, but inlining and
177 expensive optimization were not. If
<xref
178 linkend=
"guc-jit-inline-above-cost"/> or
<xref
179 linkend=
"guc-jit-optimize-above-cost"/> were also lowered,
184 <sect1 id=
"jit-configuration" xreflabel=
"JIT Configuration">
185 <title>Configuration
</title>
188 The configuration variable
189 <xref linkend=
"guc-jit"/> determines whether
<acronym>JIT
</acronym>
190 compilation is enabled or disabled.
191 If it is enabled, the configuration variables
192 <xref linkend=
"guc-jit-above-cost"/>,
<xref
193 linkend=
"guc-jit-inline-above-cost"/>, and
<xref
194 linkend=
"guc-jit-optimize-above-cost"/> determine
195 whether
<acronym>JIT
</acronym> compilation is performed for a query,
196 and how much effort is spent doing so.
200 <xref linkend=
"guc-jit-provider"/> determines which
<acronym>JIT
</acronym>
201 implementation is used. It is rarely required to be changed. See
<xref
202 linkend=
"jit-pluggable"/>.
206 For development and debugging purposes a few additional configuration
207 parameters exist, as described in
208 <xref linkend=
"runtime-config-developer"/>.
212 <sect1 id=
"jit-extensibility">
213 <title>Extensibility
</title>
215 <sect2 id=
"jit-extensibility-bitcode">
216 <title>Inlining Support for Extensions
</title>
218 <productname>PostgreSQL
</productname>'s
<acronym>JIT
</acronym>
219 implementation can inline the bodies of functions
220 of types
<literal>C
</literal> and
<literal>internal
</literal>, as well as
221 operators based on such functions. To do so for functions in extensions,
222 the definitions of those functions need to be made available.
223 When using
<link linkend=
"extend-pgxs">PGXS
</link> to build an extension
224 against a server that has been compiled with LLVM JIT support, the
225 relevant files will be built and installed automatically.
229 The relevant files have to be installed into
230 <filename>$pkglibdir/bitcode/$extension/
</filename> and a summary of them
231 into
<filename>$pkglibdir/bitcode/$extension.index.bc
</filename>, where
232 <literal>$pkglibdir
</literal> is the directory returned by
233 <literal>pg_config --pkglibdir
</literal> and
<literal>$extension
</literal>
234 is the base name of the extension's shared library.
238 For functions built into
<productname>PostgreSQL
</productname> itself,
239 the bitcode is installed into
240 <literal>$pkglibdir/bitcode/postgres
</literal>.
246 <sect2 id=
"jit-pluggable">
247 <title>Pluggable
<acronym>JIT
</acronym> Providers
</title>
250 <productname>PostgreSQL
</productname> provides a
<acronym>JIT
</acronym>
251 implementation based on
<productname>LLVM
</productname>. The interface to
252 the
<acronym>JIT
</acronym> provider is pluggable and the provider can be
253 changed without recompiling (although currently, the build process only
254 provides inlining support data for
<productname>LLVM
</productname>).
255 The active provider is chosen via the setting
256 <xref linkend=
"guc-jit-provider"/>.
259 <sect3 id=
"jit-pluggable-provider-interface">
260 <title><acronym>JIT
</acronym> Provider Interface
</title>
262 A
<acronym>JIT
</acronym> provider is loaded by dynamically loading the
263 named shared library. The normal library search path is used to locate
264 the library. To provide the required
<acronym>JIT
</acronym> provider
265 callbacks and to indicate that the library is actually a
266 <acronym>JIT
</acronym> provider, it needs to provide a C function named
267 <function>_PG_jit_provider_init
</function>. This function is passed a
268 struct that needs to be filled with the callback function pointers for
271 struct JitProviderCallbacks
273 JitProviderResetAfterErrorCB reset_after_error;
274 JitProviderReleaseContextCB release_context;
275 JitProviderCompileExprCB compile_expr;
278 extern void _PG_jit_provider_init(JitProviderCallbacks *cb);