Skip to content

docs/benchmarks.md cross-engine table was measured before column projection landed and understates pgColumnar by ~50x on q6 #348

Description

@jdatcmd

Summary

docs/benchmarks.md publishes a cross-engine query latency table measured on a build where column projection was silently discarded. It understates pgColumnar substantially, in user-facing documentation.

Evidence

docs/benchmarks.md was last committed 2026-08-02 12:53 (9d55442). #339, which made the reader honour the projection, merged at 17:33 the same day -- 4.7 hours later. Every number in that table therefore comes from a build in which every query read and decoded every column of the table regardless of what it referenced (#338).

The published table (docs/benchmarks.md:378-391) currently states:

query pgColumnar TimescaleDB heap Citus
q6 81,966 1,771 14,699 8,810
q4 18,856 5,098 17,290 6,694
q5 22,671 10,437 21,247 15,407

Measured today on the bench, current main, same 100M fixture, fixtures asserted:

arm time buffers
pgColumnar q6, projection+fold, parallel 1,559 ms 70,416
pgColumnar q6, projection+fold, serial 4,357 ms 69,924
TimescaleDB q6, serial 5,597 ms 603,211
heap q6, parallel 9,067 ms 2,435,728

So the published q6 figure is off by a factor of roughly 50, in the direction of making the project look worse than it is. The table also shows pgColumnar losing to heap on q4 and q5; whether that still holds is unknown, because those are grouped shapes and nobody has measured what projection alone does to them.

What needs doing

  1. Re-run the whole cross-engine table on current main. Not a one-row patch. Only q6 has been re-measured, and patching a single row of a table whose other rows come from a different build would be worse than leaving it consistent-but-stale.
  2. Resolve the TimescaleDB parallel fault first, or the TimescaleDB column cannot be reproduced. On the bench box its parallel path fails:
    ERROR:  could not read blocks 0..0 in file "base/16384/6345917": read only 0 of 8192 bytes
    CONTEXT:  parallel worker
    
    TimescaleDB 2.29.0, 3 chunks, all compressed. This looks like a fault in this installation rather than a property of TimescaleDB, and it means any cross-engine parallel comparison from this box is currently serial-vs-parallel and therefore unfair in pgColumnar's favour.
  3. State the GUC configuration in the table. Three of the four levers default off (enable_ungrouped_vector_agg, enable_parallel_vector_agg, enable_group_vectorization). A number measured with them on is not what a default install gives, and the table should say which it is reporting.
  4. Check the storage figures too. The body of Vectorized decompression + aggregation for full-scan aggregates (~4× behind TimescaleDB) #289 says 2.67 GB for pgColumnar against TimescaleDB's 7.79 GB; docs/benchmarks.md:369-373 says 6.4 GB against 7.8 GB at the same row count. The TimescaleDB side agrees between the two, the pgColumnar side does not. One of them is wrong and I could not determine which.

Why this is worth a separate issue

A stale number in an issue misleads the people working on it. A stale number in docs/ misleads everyone who reads the project. This one is also stale in the unusual direction -- it makes pgColumnar look far worse than it measures today -- so it is unlikely to be caught by anyone defending a claim.

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions