<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/all-your-gucs-in-a-row-jit-and-jit-provider-miinlt3ue" -->

---
title: All Your GUCs in a Row: jit and jit_provider | daily.dev
description: An in-depth look at PostgreSQL's jit and jit_provider settings explains how JIT compilation trades upfront compile time for faster execution on expensive...
canonical: https://daily.dev/posts/all-your-gucs-in-a-row-jit-and-jit-provider-miinlt3ue
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: All Your GUCs in a Row: jit and jit_provider | daily.dev
og:description: An in-depth look at PostgreSQL's jit and jit_provider settings explains how JIT compilation trades upfront compile time for faster execution on expensive...
og:url: https://daily.dev/posts/all-your-gucs-in-a-row-jit-and-jit-provider-miinlt3ue
og:image: https://api.daily.dev/og/posts/miINLt3ue.png
og:image:alt: All Your GUCs in a Row: jit and jit_provider
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# All Your GUCs in a Row: jit and jit_provider

**[Planet PostgreSQL](https://daily.dev/sources/planet-postgresql)** · 3 min read · 0 upvotes · 0 comments

## Summary

An in-depth look at PostgreSQL's jit and jit_provider settings explains how JIT compilation trades upfront compile time for faster execution on expensive analytical queries. It highlights a silent failure mode: if the llvmjit shared library isn't installed (common on Debian/Ubuntu packages built with --no-install-recommends, and deliberately excluded on RPM builds), jit=on has no effect, produces no error or warning, and queries simply run without JIT. The only reliable check is running pg_jit_available() with jit turned on, since the config setting alone doesn't guarantee the library actually loaded.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://postgr.es/p/9sk>

## Questions this post answers

### Why does EXPLAIN ANALYZE show no JIT section even though jit is set to on in postgresql.conf?

The jit_provider library, llvmjit.so, may not actually be installed even though jit=on. PostgreSQL raises no error or warning in this case by design; queries simply run without JIT. On PGDG Debian/Ubuntu packages, llvmjit lives in a separate postgresql-VERSION-jit package that's only recommended, not required, so images built with --no-install-recommends silently lack it. RPM builds exclude it entirely by default.

_Anyone chasing silent JIT failures can find PostgreSQL configuration deep-dives like this through daily.dev._

### How can I verify that PostgreSQL JIT compilation is actually working, not just enabled in config?

Run SELECT pg_jit_available() with jit turned on; it returns true only when jit is on and the provider library actually loaded successfully. It returns false whenever jit is off too, so the check only means something with the switch on. A jit=on setting in the config file is an intention, not a fact about whether compilation ever happens.

_Database engineers verifying real-world PostgreSQL behavior rely on daily.dev to surface these operational gotchas._

### Why doesn't EXPLAIN (ANALYZE, COSTS OFF) show whether JIT ran on a PostgreSQL query?

COSTS OFF suppresses the entire JIT section of the plan output, not just the cost estimates, so a plan lacking a JIT block proves nothing about whether JIT actually fired. TIMING OFF behaves differently: it keeps the JIT block and only drops the timing line, making it the safer choice when sharing plans for diagnosis.

_Developers debugging query plans can keep tabs on PostgreSQL EXPLAIN quirks like this via daily.dev._

## Similar posts on daily.dev

- [All Your GUCs in a Row: jit\_above\_cost, jit\_inline\_above\_cost, and jit\_optimize\_above\_cost](https://daily.dev/posts/all-your-gucs-in-a-row-jit-above-cost-jit-inline-above-cost-and-jit-optimize-above-cost-zqoav78ew) · Planet PostgreSQL · 7 upvotes · 1 comments
- [All Your GUCs in a Row: jit\_debugging\_support, jit\_dump\_bitcode, and jit\_profiling\_support](https://daily.dev/posts/all-your-gucs-in-a-row-jit-debugging-support-jit-dump-bitcode-and-jit-profiling-support-4ginaqptf) · Planet PostgreSQL · 0 upvotes · 0 comments
- [GitHub - vladich/pg\_jitter: Better JIT for Postgres](https://daily.dev/posts/github---vladich-pg-jitter-better-jit-for-postgres-1f5av3dwn) · Hacker News · 3 upvotes · 0 comments
- [All Your GUCs in a Row: jit\_expressions and jit\_tuple\_deforming](https://daily.dev/posts/all-your-gucs-in-a-row-jit-expressions-and-jit-tuple-deforming-yfhfhzfg1) · Planet PostgreSQL · 0 upvotes · 0 comments

---

Tags: [#general-programming](https://daily.dev/tags/general-programming), [#postgresql](https://daily.dev/tags/postgresql)

[View this post on daily.dev](https://daily.dev/posts/all-your-gucs-in-a-row-jit-and-jit-provider-miinlt3ue)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"All Your GUCs in a Row: jit and jit_provider","url":"https://daily.dev/posts/all-your-gucs-in-a-row-jit-and-jit-provider-miinlt3ue","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/all-your-gucs-in-a-row-jit-and-jit-provider-miinlt3ue"},"datePublished":"2026-08-15T01:02:39.663Z","dateModified":"2026-08-15T01:03:04.846Z","description":"An in-depth look at PostgreSQL's jit and jit_provider settings explains how JIT compilation trades upfront compile time for faster execution on expensive...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/435fd69d60639ee699a23f1d6140cd6d?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/435fd69d60639ee699a23f1d6140cd6d?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Planet PostgreSQL","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Planet PostgreSQL","logo":"https://media.daily.dev/image/upload/logos/placeholder.jpg","url":"https://daily.dev/sources/planet-postgresql"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/all-your-gucs-in-a-row-jit-and-jit-provider-miinlt3ue","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"general-programming,postgresql","timeRequired":"PT3M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Planet PostgreSQL","item":"https://daily.dev/sources/planet-postgresql"},{"@type":"ListItem","position":3,"name":"All Your GUCs in a Row: jit and jit_provider"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/all-your-gucs-in-a-row-jit-and-jit-provider-miinlt3ue#faq","mainEntity":[{"@type":"Question","name":"Why does EXPLAIN ANALYZE show no JIT section even though jit is set to on in postgresql.conf?","acceptedAnswer":{"@type":"Answer","text":"The jit_provider library, llvmjit.so, may not actually be installed even though jit=on. PostgreSQL raises no error or warning in this case by design; queries simply run without JIT. On PGDG Debian/Ubuntu packages, llvmjit lives in a separate postgresql-VERSION-jit package that's only recommended, not required, so images built with --no-install-recommends silently lack it. RPM builds exclude it entirely by default. Anyone chasing silent JIT failures can find PostgreSQL configuration deep-dives like this through daily.dev."}},{"@type":"Question","name":"How can I verify that PostgreSQL JIT compilation is actually working, not just enabled in config?","acceptedAnswer":{"@type":"Answer","text":"Run SELECT pg_jit_available() with jit turned on; it returns true only when jit is on and the provider library actually loaded successfully. It returns false whenever jit is off too, so the check only means something with the switch on. A jit=on setting in the config file is an intention, not a fact about whether compilation ever happens. Database engineers verifying real-world PostgreSQL behavior rely on daily.dev to surface these operational gotchas."}},{"@type":"Question","name":"Why doesn't EXPLAIN (ANALYZE, COSTS OFF) show whether JIT ran on a PostgreSQL query?","acceptedAnswer":{"@type":"Answer","text":"COSTS OFF suppresses the entire JIT section of the plan output, not just the cost estimates, so a plan lacking a JIT block proves nothing about whether JIT actually fired. TIMING OFF behaves differently: it keeps the JIT block and only drops the timing line, making it the safer choice when sharing plans for diagnosis. Developers debugging query plans can keep tabs on PostgreSQL EXPLAIN quirks like this via daily.dev."}}]}
```

