Now on Google Cloud Marketplace — start a trial in your own project
Performance & evidence

Not a claim. A documented fact.

Documented, falsifiable, and peer-reviewable — with the methodology and dataset published.

DOI 10.5281/zenodo.19503175 · Zenodo
8,151,597
rows/sec peak — enterprise hardware
3,032,564,040
rows — single machine, 40 workers
Δ0
net row-count delta — every run
0
failed jobs — ever recorded

Most vendors ask you to trust a number on a slide. We published ours. The full methodology, hardware configuration, NUMA-anomaly data, WAL-determinism analysis, and per-concurrency throughput curves live in a paper with a permanent DOI — and the benchmark harness plus a real public dataset are free to download, so you can reproduce the result on your own hardware. The paper's finding is blunt: across every environment tested, the engine is never the limiting factor. The hardware is.

Enterprise hardware

The engine introduced no ceiling of its own.

On a Pure Storage FlashArray X90R4, the bottleneck migrated entirely off storage and onto CPU. The software never became the limit.

30-worker peak · Intel Xeon Gold 6326 · Pure Storage FlashArray X90R4 · Linux · PostgreSQL 18

8,151,597 rows/sec, sustained.

2,274,000,000
rows inserted · 30 workers
8,151,597
rows/sec · peak
Δ0
net row delta
0
failed jobs
40-worker run · maximum validated scale · same enterprise hardware

3,032,564,040 rows. One machine. Zero failures.

3,032,564,040
total rows ingested
0
dropped rows
0
malformed rows
0
row-count delta
Real dataset · real workload

The full 401 GB federal corpus, in 60.5 minutes.

Not a synthetic stress test. The Free Law Project's complete CourtListener archive — 32 structurally heterogeneous datasets, including the 347 GB opinions table — reconstituted into an empty PostgreSQL 18 database in a single concurrent pass, on a consumer desktop.

All 32 datasets · concurrent reconstitution · 2026-05-29 · AMD Ryzen 9 9950X3D (16C/32T) · 62 GB RAM · consumer NVMe

60.5 minutes wall time. Lossless.

401 GB
heterogeneous source · 32 schemas
2,608,874,016
total rows · engine-recorded
719,109
rows/sec · sustained 60 min
32 / 32
datasets ingested
0
failed jobs
0
malformed rows
0
dropped rows
0
row-count delta — lossless

A homogeneous concurrent test proves the scheduler is stable. A heterogeneous corpus proves the engine: citation tables are wide and sparse; opinion clusters are dense with long text; opinions itself is billions of small rows across 347 GB; dockets carry 51 wide columns of highly variable size. The engine adapted batch sizing and arena allocation per job, simultaneously — zero failures across 2.6 billion rows.

Direct database-to-database

No staging. No orchestration. No intermediary.

DataForge streams from a source database straight into a destination database — cross-engine — through the same Parse → Filter → Accumulate → Write pipeline. Source cursor to destination write, one pass.

TransferRowsElapsedRows/secParity
SQL Server → PostgreSQL75,814,1013m 03s413,325Lossless · scanned = written
PostgreSQL → SQL Server75,814,1015m 14s241,009Lossless · scanned = written

The 1.7× difference between directions is protocol-driven, not engine-driven: PostgreSQL's COPY FROM STDIN is one streaming call per batch, while SQL Server's TDS bulk path carries per-row encoding overhead. The DataForge execution path is identical in both directions. The asymmetry is a property of the destination; the engine is a constant.

Across clouds

The same binary, measured honestly in the cloud.

Cloud numbers carry real overhead — cold start, network transport, writes over the wire. These are end-to-end, into managed PostgreSQL, 75,814,101 rows each, zero malformed, zero dropped.

CloudInfrastructureRows/secWall timeStatus
Amazon Web ServicesEC2 c6i.4xlarge → RDS PostgreSQL r6g.2xlarge (8 vCPU / 64 GB)1,181,8071m 04sMeasured
Google CloudGCS → Cloud Run Jobs → Cloud SQL Enterprise Plus (8 vCPU / 64 GB)895,2591m 25sLive
Microsoft AzureAzure Database for PostgreSQL · capacity-constrained region~440,000constrained runPremier-region run forthcoming

What the published study establishes

  • Bottleneck migration. As storage got faster, the limiting factor moved off disk and onto CPU — the engine kept scaling until the hardware, not the software, said stop.
  • A NUMA anomaly in SQL ingestion under high concurrency — documented empirically, with the pressure curves to show it.
  • Deterministic output across heterogeneous environments — the same run produces the same reconciled result, machine to machine.
How to read these numbers

The validation model

Every result on this page is end-to-end — source file (or source cursor) through destination write, with full row-count and checksum validation. Nothing is a partial-pipeline microbenchmark. The runs are derived from a real public dataset, executed under observable and repeatable conditions, and reproducible with a comparable hardware class. Bulk-load runs create tables fresh and load without secondary indexes or foreign-key constraints — standard practice; index builds run after load and are not counted in the movement time.

The honest bound: performance is limited primarily by external system constraints — destination protocol, storage write ceiling, cloud CPU-allocation policy — rather than by DataForge itself. That is the whole point.

Contact us