# parallel_tuple_cost

> parallel_tuple_cost — Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend. Observed in PG9.6–19 Beta 3; its last measured boot default is 0.1 in PG19 Beta 3, with user context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
---

> [!NOTE]
> **Fact — official short description:** “Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend.”

## Identity {#identity}

| Field | Value | Meaning |
| --- | --- | --- |
| Type | `real` | Upstream pg_settings type |
| Context | `user` | Settable by an ordinary user |
| Unit | — | Raw unit |
| Range | `0` – `1.79769e+308` | Raw limits in the last observed version |
| Enum values | — | — for non-enum types |
| Category | Query Tuning / Planner Cost Constants | Upstream classification |
| Latest boot value | `0.1` | 0.1 |
{.fields meta="-"}

## Lifecycle {#lifecycle}

| Fact | Value |
| --- | --- |
| First observed | PG9.6 |
| Present in | PG9.6–19 Beta 3 |
| Removed in | No |
| Introduction commit | [`3bd909b22093`](https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=3bd909b220930f21d6e15833a17947be749e7fde) — Add a Gather executor node. |
| Commit date | 2015-09-30 |
| Discussion | — |

## Default history {#default-history}

| Versions | Raw `boot_val` | Unit | Human value |
| --- | --- | --- | --- |
| PG9.6–19 Beta 3 | `0.1` | — | 0.1 |
{.full-width caption="Measured PG9.0–19 Beta 3 boot defaults"}

## How it works {#mechanism}

parallel_tuple_cost models the per-row overhead of moving tuples from parallel workers to another process. It is one term in estimated path cost and does not allocate resources or change executor behavior directly.

Planner cost units are arbitrary and only their ratios matter. Scaling all cost constants together leaves path ordering unchanged; changing one alters the balance between I/O, row processing, operators, and parallel overhead.

The value is consulted when a plan is built. Statistics, row-count estimates, cache assumptions, tablespace overrides, and enabled plan methods can outweigh a small change in this constant. Its user context permits session- or transaction-local changes; newly performed or newly planned work sees the value.

## Tuning advice {#tuning-advice}

> [!TIP]
> **Advice.** These are workload-specific starting points and must be validated with measurements.

| Workload | Guidance |
| --- | --- |
| OLTP | Calibrate parallel_tuple_cost only from a representative workload, not one plan. First correct stale statistics and compare EXPLAIN (ANALYZE, BUFFERS) estimates with reality; use role or tablespace scope where possible. |
| OLAP | Analytical workloads can justify a different CPU-versus-I/O balance, but change parallel_tuple_cost together with the related cost model and validate the full scan/join/aggregate mix. |
| Small nodes | Keep the upstream value unless repeated evidence shows a systematic modeling error. On small systems, concurrency and cache residency often matter more than fine-grained changes to parallel_tuple_cost. |
{.full-width}

## Pigsty {#pigsty}

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

| Template | Effective value | Versus upstream boot | Source expression |
| --- | --- | --- | --- |
| OLTP | `0.2` | different | `0.2` |
| OLAP | Unmodified | — | — |
| CRIT | `0.2` | different | `0.2` |
| TINY | Unmodified | — | — |
{.full-width}

> [!CAUTION]
> **Advice — pending human review.** Fact from the current Pigsty template projection: OLTP: PG9.6–19 Beta 3 = 0.2 (dcs); OLAP: PG9.6–19 Beta 3 unmodified; CRIT: PG9.6–19 Beta 3 = 0.2 (dcs); TINY: PG9.6–19 Beta 3 unmodified. Advice, pending human review — Editorial inference, pending maintainer review: Doubling the tuple-transfer estimate in OLTP/crit is intended to reduce parallel-plan selection for tuple-heavy paths; OLAP and tiny retain upstream behavior.

## Common pitfalls {#common-pitfalls}

- Interpreting the value as elapsed time or a hard resource limit.
- Tuning it to repair one query and regressing the wider workload.
- Changing cost constants before correcting statistics and cardinality estimates.
- Forgetting that only relative values influence path choice.

## Related parameters {#related-parameters}

[`parallel_setup_cost`](/parameters/parallel-setup-cost/) · [`max_parallel_workers_per_gather`](/parameters/max-parallel-workers-per-gather/) · [`parallel_leader_participation`](/parameters/parallel-leader-participation/) · [`enable_gathermerge`](/parameters/enable-gathermerge/)

## References {#references}

- [PostgreSQL 19 Beta 3 — parallel_tuple_cost](https://www.postgresql.org/docs/19/runtime-config-query.html#GUC-PARALLEL-TUPLE-COST)
- [PostgreSQL 19 release notes](https://www.postgresql.org/docs/19/release-19.html)
- [Machine-readable GUC export](/data/guc.jsonl)
