Benchmarks Exograph indexing and query speed across Postgres and DuckDB using the same Hex.pm package workload.
mix exograph.bench.backends --mode top --limit 20 --iterations 10
mix exograph.bench.backends --mode top --limit 100 --runs 3 --order random --output-json bench.json
mix exograph.bench.backends --mode top --limit 20 --concurrency 4 --duckdb-threads 1
mix exograph.bench.backends --mode top --limit 20 --duckdb-shards 4 --duckdb-threads 1
mix exograph.bench.backends --mode top --limit 100 --duckdb-shards 8 --duckdb-threads 1 --duckdb-recovery-mode no_wal_writes --postgres-maintenance-work-mem 1GB --postgres-max-parallel-maintenance-workers 4 --postgres-copy --postgres-unlogged --postgres-defer-indexes --postgres-synchronous-commit off --only postgres_plain,duckdb_plain,duckdb_sharded_plain --order random --append-metrics --output-json bench.jsonRequired services:
- Postgres:
EXOGRAPH_DATABASE_URLor--database-url - DuckDB:
QUACKDB_URI/QUACKDB_TEST_URIor--quackdb-uri - Sharded DuckDB starts managed QuackDB servers and can use
--duckdb-recovery-mode no_wal_writes --onlycan restrict variants, for examplepostgres_plain,duckdb_plain,duckdb_sharded_plain- Prefixes are dropped after each run by default; use
--keep-prefixesto inspect tables manually. --explain-dir pathwrites PostgresEXPLAIN (ANALYZE, BUFFERS)plans before cleanup.
The benchmark uses fresh prefixes and reports separate plain and BM25 variants:
postgres_plain, postgres_bm25, duckdb_plain, and duckdb_bm25.