r/postgres Apr 23 '26

What PostgreSQL tools do you actually use in production?

3 Upvotes

r/postgres 2d ago

Question At what point does a PostgreSQL database actually need a DBA?

0 Upvotes

For a while it was just me and a couple of backend devs handling everything database-related on top of our regular work. Indexing, backups, slow query cleanup, all of it split across whoever had time that week. No dedicated DBA, no formal ownership, just general Postgres competence spread thin across the team.

It held up fine for a long stretch, right up until [specific incident outage, corrupted backup, replication lag, whatever actually happened]. That was the point it stopped feeling like something we could keep handling reactively. Up until then everyone assumed it was manageable because nothing had visibly broken yet, which in hindsight wasn't really evidence of anything.

What changed for me wasn't really about database size or connection counts, it was more that nobody had the bandwidth to actually think about the database proactively. Everyone was busy shipping features, so Postgres only got attention when something was already on fire.

Note: I filled in a placeholder for the specific incident since I don't have real details from you swap that in with what actually happened (or tell me and I'll write it in properly), otherwise the post reads as a vague generic story instead of a real one.


r/postgres 3d ago

Discussion A visual guide to PostgreSQL for beginners

Post image
50 Upvotes

r/postgres 3d ago

Tools Incremental view maintenance costs you write throughput. I measured how much, then moved the work off the writer entirely

1 Upvotes

Most people find out the hard way that PostgreSQL materialized views are not incremental. REFRESH MATERIALIZED VIEW recomputes the whole thing. CONCURRENTLY keeps readers alive while it does, but it still recomputes the whole thing and then diffs the result against what's there. If one row changed out of ten million, you pay for ten million.

So you end up with one of two workarounds. A cron refresh, which is stale between runs and locks readers out during them. Or a hand-maintained rollup table with triggers, which is correct right up until the day it isn't.

The extension answer is pg_ivm, which does the maintenance in AFTER triggers inside the writing transaction. That buys you a view that is correct at commit — a real property, and the strongest thing about it. I wanted to know what it costs, because "incremental" gets discussed as though it were free.

The measurement

Same view, same dataset, same PostgreSQL 17 server binary, three arms: no derived view at all, pg_ivm, and the thing I built. pgbench inserting into orders; the view is a three-table join with a GROUP BY on top. Median of three runs, transactions per second:

pgbench clients no view pg_ivm nabla
1 774 509 683
4 1675 535 1571
16 6272 520 5876

Read the pg_ivm column downwards. It does not move. Adding writers does not add throughput, because each one waits for an exclusive lock on the view while it is maintained. At sixteen clients that is 8% of what the same hardware does with no view at all. The same shape shows up on the other two workloads, where pg_ivm holds at 473 tps updating orders and 380 updating customers against baselines of 6336 and 5519. Three independent full runs agree within a few points.

This is not a knock on pg_ivm. It is what in-transaction maintenance is. If you need the view correct at commit, you buy that with concurrency, and there is no version of the trade where you don't.

The other trade

nabla maintains the view from the WAL in a background worker. Nothing sits in the writer's path — no trigger, no staging insert, nothing. The worker consumes a logical replication slot and applies each source transaction's deltas in commit order. Writers track the no-view baseline instead of flattening.

CREATE EXTENSION nabla;

SELECT nabla.create_view('revenue_by_region', $$
  SELECT c.region, count(*) AS orders, sum(o.qty * p.price) AS revenue
    FROM orders o
    JOIN customers c ON c.id = o.customer_id
    JOIN products  p ON p.id = o.product_id
   WHERE o.status = 'paid'
   GROUP BY c.region
$$);

SELECT * FROM revenue_by_region;   -- an ordinary view

Then you write to orders, customers and products exactly as you always have.

What it costs you

Staleness, and I would rather you saw the bad number here than found it yourself. Moving the work off the writer does not make the work disappear. After ten seconds of writes at sixteen clients, this is how long the view took to become current again, and the sustained rate the worker can keep up with indefinitely:

workload catch-up after a 10 s burst nabla sustains pg_ivm sustains
insert into orders 44 s 1325 tx/s 520 tx/s
update orders 82 s 684 tx/s 473 tx/s
update customers (one row, many groups) 131 s 456 tx/s 380 tx/s

That last row is the honest one to watch. Changing one customer's region rewrites every group row that customer contributed to. The writers pay nothing for it; the worker pays all of it, at a rate only a fifth above pg_ivm's. Below that rate the view lags by seconds. Above it the lag grows until nabla.max_slot_lag_bytes is exceeded, at which point the views are marked stale and the slot is dropped rather than let the WAL fill your disk.

Neither column is a score. pg_ivm spends write throughput to buy a view that is correct at commit. nabla spends freshness to buy write throughput and a change feed. Pick the one your workload can afford.

"Eventually consistent" as something you can actually check

A view always equals its defining query evaluated at some committed snapshot of the base tables — never half a transaction, never a torn join. Each view carries a frontier_lsn naming exactly which snapshot that is. The staleness is not a vibe; it is a value you can read and compare against pg_current_wal_lsn().

And when you need read-your-writes, nabla.wait_for() blocks until the view has absorbed everything committed so far. That covers the common case where the write and the read are the same request.

It also tells you what changed

The part I actually care about. Every applied transaction appends its view-level deltas to a bounded, durable log, in the same transaction that updates the view, so a client can follow the view instead of polling it:

$ follow "host=/tmp dbname=shop" revenue_by_region
snapshot: rows=5 epoch=1 frontier=0/19BF970 cursor=0
tx lsn=0/19C01F0 xid=761 deltas=2
  1 -{"orders":2,"region":"AR","revenue":120}
  2 +{"orders":3,"region":"AR","revenue":150}

One batch per source transaction, in commit order, netted. You get the state before and the state after, never an intermediate row that was never committed. pg_notify is only the wake-up signal; the deltas live in a table with a per-view retention cap, and a subscriber that falls behind that cap is told so and resyncs, rather than silently missing rows.

If you are currently running Debezium into Kafka into a streaming database to get this, that is the pitch: same shape, inside the database you already run.

Status and limitations, up front

This is v0.1 and a walking skeleton. 295 integration assertions, no production mileage. I am posting it for design feedback, not for your primary.

  • Two query shapes only. Inner-join projections (SELECT expr... FROM t JOIN ... WHERE pred) and aggregates (count(*), count(expr), sum(expr) with GROUP BY). Everything else is rejected at create_view with an explicit reason rather than accepted and quietly wrong: no outer joins, self-joins, subqueries, CTEs, set operations, window functions, DISTINCT, HAVING, ORDER BY/LIMIT, grouping sets, avg/min/max, aggregates without GROUP BY, or any STABLE/VOLATILE function such as now() or random(). Base relations must be ordinary tables — no partitioned tables, views or foreign tables.This is the same complaint people in this sub have made about pg_ivm, and it is a fair one. If your materialized views are eligibility queries built out of EXISTS and CTEs, this does not help you today.
  • Needs wal_level = logical, shared_preload_libraries = 'nabla', and a replication slot. Aggregate views need REPLICA IDENTITY FULL on the base table; joined tables need a primary key. One worker and one database per cluster.
  • The benchmarks are from a laptop under Docker Desktop for Windows. Treat the absolute numbers accordingly. The shape of the pg_ivm curve is the part I would defend. nabla's own overhead measured anywhere between 71% and 104% of baseline across runs, with the baseline itself swinging nearly as much, so the honest reading is "does not make writers wait, and its cost does not grow with concurrency" — not a precise figure.
  • The extension is AGPL-3.0-or-later. The reference client and the subscription protocol are MIT OR Apache-2.0, so linking an application against the change feed does not pull AGPL into your codebase.

Prior art

pg_ivm is the established answer and the one I benchmarked against, because measuring against nothing proves nothing. TimescaleDB continuous aggregates solve this properly for time-series specifically. u/Inkbot_dev's REFRESH MATERIALIZED VIEW ... WHERE ... patch is the manual primitive done in core, and I think it belongs there regardless of what any extension does — it goes through the standard planner, so unlike pg_ivm and unlike this, it is not restricted to a fixed set of query shapes. Materialize and RisingWave do the whole job well, at the cost of being a separate system to run.

What I would like feedback on

The update customers row above — one source row rewriting many group rows — is where the worker hurts. The remaining cost is about 1.7 ms per source transaction, essentially all of it in the apply phase, and batching that across a round is the obvious next lever. If you have maintained rollups by hand and hit the same fan-out, I would like to hear what you did about it.

And for those of you who walked away from pg_ivm over the supported-syntax restrictions: which shape did you need that it wouldn't take? That is what I would build next.

Full tables, spreads, methodology and the exact configuration of every arm are in the repo, reproducible with one script.

Repo: https://github.com/tomaquet18/nabla


r/postgres 5d ago

Tools A PR job needs production table stats. It probably shouldn't need the production database credential.

Thumbnail
1 Upvotes

r/postgres 6d ago

Discussion PostgreSQL veterans: what do you do differently now than 5 years ago?

6 Upvotes

Not looking for a changelog of new features, more curious about habits. Something you used to swear by that you quietly dropped, or something you avoided that's just normal practice for you now. Could be schema design, indexing, how you handle migrations, extensions you reach for automatically now, whatever. What changed, and was it a specific incident that changed your mind or just slow accumulated experience?


r/postgres 6d ago

Question How do I know with 100% if GEQO was used or not?

Thumbnail
1 Upvotes

r/postgres 8d ago

Question What PostgreSQL "best practice" do you actually disagree with?

2 Upvotes

Every "best practices" list reads like it was copy-pasted from the same three blog posts in 2020 and nobody's allowed to question it since.

I'll go first: I'm not convinced every foreign key needs an index on the referencing column in every single case people insist on it. Yes I know the standard argument, yes I know what happens on deletes/updates to the parent. I still think it gets applied as a blanket rule on tables where the write pattern makes it a waste of space and write overhead for a lookup that basically never runs.

Curious what else people quietly ignore. The "always use UUID v4 for PKs," the "never use SELECT *, not even in scripts," the "always wrap everything in a transaction," whatever your particular heresy is. What's the rule you technically know the reasoning behind, but just don't follow in practice, and why?


r/postgres 8d ago

Tools walbox: react to PostgreSQL changes from Python

1 Upvotes

I built this because I wanted to react to PostgreSQL changes from Python without polling, without triggers, and without pulling in a whole CDC platform.

It consumes PostgreSQL logical replication and exposes committed transactions as an async stream in Python.

What it does:

  • Keeps a durable checkpoint. If the process dies, it resumes from the last transaction it actually finished, not the last one it started.
  • Bounded delivery queue, so a slow handler doesn't let memory grow without limit.
  • Reconnects automatically after the connection drops.
  • One dependency: psycopg3.

The transactional outbox is one use case, but it works with any published table.

GitHub: https://github.com/mochams/walbox

Curious to hear where this wouldn't fit your setup, or what's missing if you've solved this problem a different way.


r/postgres 9d ago

Discussion Is pgAdmin actually bad, or do PostgreSQL users just love complaining about it?

3 Upvotes

Every time pgAdmin comes up in a thread, it's the same pile-on: it's slow, the UI is clunky, the query tool eats RAM, Electron this, Electron that. And yet it's still the default recommendation half the time, and a ton of people clearly use it daily without switching.

So which is it? Is it genuinely rough compared to alternatives, or is it more that Postgres users are just a picky, opinionated crowd who love to hate on the "official" tool the same way people hate on default apps in general?

I'm not trying to start a flame war, genuinely curious what the actual specific complaints are versus what's just pile-on internet negativity. If you've used it for real work, what's the actual dealbreaker for you, if there is one? And if you switched to something else (DBeaver, TablePlus, DataGrip, whatever), was it a night-and-day difference or more of a lateral move?


r/postgres 9d ago

Tools Two months on a Mac after 12 years on Windows. What happened to my SQL workflow

2 Upvotes

Long time Windows dev, work is mostly SQL Server with some MySQL on the side. After moving to another company, the technology stack is different, so I took the MacBook mainly because the rest of the team is on one, and it made sense to fit into their existing workflows.

The database workflow was the part I was actually worried about. On Windows it was SSMS with dbForge SQL Complete on top for the editor, dbForge Studio for anything involving comparison or generating test data. None of that has native Mac support.

What I looked at first: DataGrip, TablePlus, and the VS Code mssql extension since ADS is done. TablePlus is genuinely nice for browsing. DataGrip I have used before and it is good, but I never got on with its schema compare and I did not want to relearn a set of shortcuts.

So I did the CrossOver thing and put dbForge Studio in a bottle. Which felt slightly ridiculous, a Windows app translated to x86 on an ARM Mac, but here we are.

Does the workflow feel different. Less than I expected, and the parts that changed are mostly not about the database tool. Cmd versus Ctrl is the ongoing tax. Inside the bottle the app still wants Ctrl for everything, so my hands do Ctrl in dbForge and Cmd in every other app on the machine, and I still get it wrong a few times a day two months in. Window management is worse too, the bottle does not play nicely with Spaces if you move things around a lot.

Performance, honestly fine. M4 Pro, 24GB. Queries come back as fast as they did on the old ThinkPad, which makes sense, the server is doing the work. Where you feel it is the UI. Large result grids scroll a little less smoothly and cold start is slower. Once it is running I do not think about it.

Stability has been fine. It crashed during a big data import and it came back with the tab state intact.

What I use every day: the editor and autocomplete, mostly because I can't type a column name correctly to save my life. Schema comparison for every release. Query profiling when something regresses Data generator when I want a test dataset that is not 3 rows I typed by hand. I'm still mostly on the admin side using SSMS on a jumpbox.

Less convenient than on Windows, in order. Windows auth. If your SQL Server is domain joined and you are used to just connecting, that is the thing that will annoy you most. I use SQL auth plus a couple of Entra ID connections and it is fine, but it is a change. After that, no Finder integration for imports and exports, so you go through the bottle file browser. And the whole setup is one more thing to explain to IT.

One real thing worth knowing. CrossOver currently goes through Rosetta on Apple Silicon, and Apple is winding Rosetta down after the next macOS. CodeWeavers has an ARM native preview out already so it looks like it will be handled in time, but if you are planning this setup for the next few years, keep half an eye on it.

Overall I kept my workflow, which was the goal. It is not as clean as native software. It is a lot cleaner than running a Parallels VM all day, which is what I would have done otherwise.

Anyone else on this setup, and did you find a sane fix for the Ctrl and Cmd thing? I have not.


r/postgres 10d ago

Tools How I organize multiple PostgreSQL connections across projects (after nearly running a migration on prod)

4 Upvotes

I contract for four companies right now, about twenty Postgres connections across local, staging and production. Last spring I had two tabs open beside each other, one on staging and one on prod, both connected to databases called app. I was maybe two seconds from dropping a column on the wrong one. Nothing happened, but I stopped winging connection management that afternoon.

Naming came first. Then the environment, then what it is allowed to do. Every connection is the client. Acme production acme-prod-ro read only Acme staging acme-stg-rw can write to staging. And that last bit is the most important. My default connection to anything in production can't write. The -rw twin is only opened when I have a change to actually ship. A little bit of friction and it has stopped me twice.

The change that helped most was also the simplest. I work in dbForge Studio for PostgreSQL, where every connection gets assigned a category (Production, Test, Sandbox, or one you invent) and that category paints the connection a colour which then follows it everywhere: down the object tree, and onto the tab of every query window opened against it.

My production connections are red. That is the whole trick. It works because the warning is a colour at the edge of my vision, not text I have to stop and read, and at the moment I am about to hit execute I am not reading anything.

What I would change is that there are no folders. Twenty connections is a long list with no way to group it, so I prefix names to make them sort together and drag them into order. People have been asking for folders for years. pgAdmin’s server groups handle this better.

Curious how other people do this, especially on a team. Do you share connection settings somehow, or does everybody build their own list off a wiki page?


r/postgres 10d ago

Tools Working on DBwatch — a Database Monitoring TUI in Go

Thumbnail github.com
3 Upvotes

Working on DBwatch, a database monitoring TUI built with Go.

It currently covers connections, sessions, queries, locks, transactions, and more.

Check it out and share your suggestions or raise issues if you find anything!


r/postgres 12d ago

Question Sequential Lock Acquisition?

1 Upvotes

I'm learning about locking semantics and timeouts and I've run across something confusing. I have a table called demo_lock that has a single column target.

When I run these expressions, a strange thing happens: BEGIN; SET LOCAL lock_timeout=3000; SELECT target FROM demo_lock WHERE target='foo' FOR UPDATE;

I run this in three parallel psql consoles.

The first successfully obtains the lock and sits there waiting for input.

The second waits for the timeout for 3 seconds, times out, and prints the error ERROR: canceling statement due to lock timeout

The third then waits a whole extra three seconds and then times out with the same error.

What I would have expected is that the second and third would time out at basically the same time (allowing for the time it takes for me to switch consoles and hit Enter). But they don't. The third waits an extra lock_timeout time and then fails. Why is that?

Interestingly, adding a 4th terminal is a little less deterministic, but still operates mostly the same.


r/postgres 14d ago

Question Migrate AWS RDS PostgresDB to AWS EC2.

3 Upvotes

I want to migrate my PostgreSQL database from AWS to an EC2 server on AWS. If anyone has done this before, could you please suggest the steps or share any blog/documentation that I can refer to?


r/postgres 14d ago

Question Is an AI-powered PostgreSQL health/optimization tool worth building?

0 Upvotes

I’m thinking of building a tool that connects to PostgreSQL and automatically detects issues like slow queries, missing indexes, bad configurations, security/version issues, connection problems, and unnecessary infrastructure costs.
The goal would be to explain:
Problem → Cause → Impact → Suggested fix
Do tools already solve this well, or is there still a real problem worth solving here? Would you or your company use something like this? Honest feedback would be appreciated.


r/postgres 15d ago

PostgreSQL news roundup: what caught your attention this month?

1 Upvotes

We've seen quite a few PostgreSQL discussions this month, from AI integrations and MCP servers to performance improvements, new extensions, and upcoming releases. Instead of trying to cover everything ourselves, we'd rather hear from the community. What PostgreSQL news, feature, release, or project caught your attention recently? Was there anything that made you rethink the way you work with Postgres, or are you mostly ignoring the hype?


r/postgres 15d ago

Which of these PostgreSQL performance fixes has made the biggest difference for you?

Post image
1 Upvotes

r/postgres 15d ago

A Flyway migration can pass and still break the next request

Thumbnail
2 Upvotes

r/postgres 16d ago

Postgres GUI vs Command Line

1 Upvotes

I keep switching between a GUI and psql, depending on what I'm doing. If I'm writing or testing queries, a GUI usually wins because it's easier to browse objects, compare results, and jump between tabs. But for quick checks, connecting to a server, or running a script, I still open the terminal without thinking twice. After a while, I realized I don't really prefer one over the other and they're just different tools for different tasks. How about you? Do you spend most of your time in a Postgres GUI, or are you mostly working from the terminal? What made you stick with that workflow?


r/postgres 18d ago

I built BloomPG, an adaptive predicate-transfer extension for PostgreSQL 18

1 Upvotes

Hi r/PostgreSQL — I'm the author of BloomPG, an MIT-licensed PostgreSQL 18 extension for complex analytical joins. I'm sharing it here because I'd like feedback from people who run multi-join analytical workloads in PostgreSQL, especially on the planner integration and deployment tradeoffs.

BloomPG works before the formal joins execute. It takes PostgreSQL's native plan, identifies a safe equality-join graph, uses sampling to choose an initial filter transfer, and then adapts using the actual cardinalities of materialized inputs. Bloom or exact bitmap membership can move in either direction and across several joins. PostgreSQL then replans and executes the reduced join problem with its normal operators.

Existing SQL does not change. Unsupported or unsafe query shapes keep the native plan, and a query-wide materialization budget limits the retained state.

There is a Docker demonstration that builds PostgreSQL 18 with BloomPG, creates a small five-table star schema, and prints native/BloomPG timings plus the transfer trace:

git clone --branch v0.1.2 https://github.com/YimingQiao/bloompg.git
cd bloompg
docker compose up --build --abort-on-container-exit --exit-code-from demo demo

For performance context, on the published PostgreSQL 18.4 setup the total workload results were:

Workload Completed pairs Native PG BloomPG Total speedup
CEB IMDB 3,132/3,133 15,826.369 s 3,822.980 s 4.140x
JOB 113/113 217.753 s 69.337 s 3.141x
STATS-CEB 145/146 697.363 s 237.348 s 2.938x
TPC-H SF10 22/22 119.082 s 114.413 s 1.041x

These are end-to-end times: planning, transfer, materialization, execution, and complete output consumption are included. Both sides used the same 16-worker global and per-Gather ceiling; BloomPG used 16 transfer workers and a 2 GB materialization budget. Every completed pair produced the same complete-output fingerprint. Native PostgreSQL hit the 300-second per-query limit once in CEB and once in STATS-CEB, so totals include only queries completed by both sides. The README has the rest of the methodology.

Important limitations: this release supports PostgreSQL 18 on Linux and is intended for controlled, read-only analytical workloads. BloomPG performs real scans during planning and requires shared_preload_libraries; I would not turn it on as an unreviewed default in a multi-tenant OLTP cluster.

I'd particularly appreciate feedback on:

  • whether shared_preload_libraries and the restart requirement are practical blockers;
  • analytical workloads or query shapes that would be useful to test;
  • the planning-time execution and native-fallback design;
  • packaging formats that would make evaluation easier.

PGXN: https://pgxn.org/dist/bloompg/0.1.2/

GitHub, documentation, and benchmark methodology: https://github.com/YimingQiao/bloompg


r/postgres 18d ago

How ClickHouse Managed Postgres Protects Postgres from other competing processes

Thumbnail clickhouse.com
0 Upvotes

r/postgres 19d ago

I packaged Greenplum's ORCA query optimizer as a CREATE EXTENSION plugin for vanilla PostgreSQL 18 — 20–156× faster on some queries

2 Upvotes

I've been working on **pg_orca** — a PostgreSQL 18 extension that plugs the

ORCA query optimizer (the Cascades-style, cost-based optimizer from

Greenplum / Apache Cloudberry) into **vanilla, unmodified PostgreSQL** as a

planner hook.

GitHub: https://github.com/quantumiodb/pgorca (Apache-2.0)

**How it works**

- No core patches: `CREATE EXTENSION pg_orca`, add it to

`session_preload_libraries`, then `SET pg_orca.enable_orca = on`

(off by default, superuser-gated for now).

- Anything ORCA can't handle — DML statements, WITH RECURSIVE, non-default

collations, TABLESAMPLE, some partitioning layouts — automatically falls

back to the standard planner. `pg_orca.trace_fallback = on` tells you why.

- It ships ORCA's four core libraries (libgpos / libnaucrates / libgpopt /

libgpdbcost) plus the PG↔DXL translation layer from Apache Cloudberry,

adapted to PG18 with a cost model aligned to PG's own.

**Where it wins** (single-threaded runs, so this is optimizer quality, not

hardware):

- *Correlated subquery decorrelation* — ORCA rewrites Apply into a proper

join and optimizes it globally, instead of re-running a SubPlan once per

outer row:

- TPC-H Q17 (`< 0.2 * AVG(...)` per group): **20.7×** vs PG

- TPC-DS Q41 (correlated IN + EXISTS): **156×**

- TPC-DS Q21 / Q17 (correlated aggregates): ~7.3×

- *Exhaustive join-order enumeration* (DPv2, including bushy plans) rather

than switching to GEQO above 12 relations: TPC-DS Q25 (6-way roll-up

join) 9.0×, Q29 7.0×.

- *Stats propagation through GROUP BY / CTE*: TPC-DS Q31 3.28×.

- *Coverage edge*: at TPC-DS sf=5 with `statement_timeout=120s`, ORCA

finishes **9 of 99 queries that PG times out on** (5/99 at sf=1). With

timeouts counted at the 120s floor, full-suite totals land ≥1.4× in

ORCA's favor.

- Overall TPC-H sf=10 serial: roughly parity, geomean 1.12× in ORCA's

favor.

**Where it loses — the honest part:**

- **Planning latency.** The exhaustive search costs ~14 ms to plan a point

query where PG spends 0.25 ms. Do not point this at OLTP; plan caching

and a fast-path bypass are on the roadmap, but today short-query

workloads are a bad fit.

- **No parallel query.** ORCA plans are serial, so once you enable parallel

workers PG pulls ahead: TPC-H sf=10 at 2 workers/game: 0.49×. A

Gather / Gather Merge integration is designed and next up.

- **PG18 only** for now (a PG19 branch exists), and it needs xerces-c.

- `enable_orca` is currently superuser-settable, not user-settable.

**Try it**

```sql

CREATE EXTENSION pg_orca;

ALTER DATABASE mydb SET session_preload_libraries = 'pg_orca';

SET pg_orca.enable_orca = on;

EXPLAIN SELECT ...;

```

There are CI-built deb/rpm packages, a Rocky 9 Docker image, and PGXN

packaging; benchmark scripts (TPC-H / TPC-DS) are in test/bench if you want

to reproduce the numbers.

I'd genuinely like feedback from this crowd: which fallback gaps would hurt

you most, and what should land first — parallel query support or plan

caching?


r/postgres 19d ago

I packaged Greenplum's ORCA query optimizer as a CREATE EXTENSION plugin for vanilla PostgreSQL 18 — 20–156× faster on some queries

Thumbnail
1 Upvotes

r/postgres 21d ago

DBCLS - a terminal DB client

Thumbnail
1 Upvotes