| Recall | PRISM | pgvector HNSW (halfvec) | Δ vs best competitor |
|---|---|---|---|
| 0.90 | 1,116 | 595 | +88% |
| 0.95 | 591 | 346 | +71% |
| 0.99 | 149 | 59 | +151% |
| Recall · clients | PRISM | pgvector HNSW (halfvec) | Δ vs best competitor |
|---|---|---|---|
| 0.95 · 1 client | 573 (573) p50 1.73 ms · p95 2.04 ms | 485 (485) p50 2.07 ms · p95 2.84 ms | +18% |
| 0.95 · 16 clients (1x of 16 CPUs) | 7,009 (7,021) · 12.2× p50 2.25 ms · p95 2.66 ms | 6,541 (6,555) · 13.5× p50 2.45 ms · p95 3.34 ms | +7% |
| 0.95 · 32 clients (2x of 16 CPUs) | 6,892 (6,912) · 12.0× p50 4.52 ms · p95 8.11 ms | 5,500 (5,514) · 11.3× p50 5.69 ms · p95 10.49 ms | +25% |
| 0.99 · 1 client | 174 (174) p50 5.71 ms · p95 6.64 ms | 131 (131) p50 7.72 ms · p95 9.92 ms | +32% |
| 0.99 · 16 clients (1x of 16 CPUs) | 2,327 (2,330) · 13.4× p50 6.80 ms · p95 7.92 ms | 1,907 (1,911) · 14.5× p50 8.50 ms · p95 10.81 ms | +22% |
| 0.99 · 32 clients (2x of 16 CPUs) | 2,280 (2,284) · 13.1× p50 14.00 ms · p95 20.91 ms | 1,743 (1,747) · 13.3× p50 18.64 ms · p95 27.02 ms | +31% |
Each configuration is measured at its operating point for the target: its fastest sweep point whose recall reaches it. Values are measured there, not interpolated, so the recall can be above the target. Each cell is wall-clock QPS over the whole run, then in parentheses the throughput while every client is busy, which leaves out the drain at the end, and below them the p50 and p95 query latency over all clients. With more than one client, N× is the speedup: wall-clock QPS over the same configuration's single-client wall-clock QPS at that target. Ideal scaling matches the client count until the host's CPUs saturate, after which it flattens. Clients are concurrent connections from rekall, and CPU counts are the rekall host's. Wall-clock QPS includes rekall's own work between queries, so the 1-client row reads a little below QPS at recall, which comes from query latency. Recall is distance-based (ann-benchmarks, tie-aware).
Measured on config — PRISM @0.95: prism-defaults (r=0.970) · pgvector HNSW (halfvec) @0.95: hnsw-m24-halfvec (r=0.951) · PRISM @0.99: prism-defaults (r=0.994) · pgvector HNSW (halfvec) @0.99: hnsw-m24-halfvec (r=0.992)
| PRISM | pgvector HNSW (halfvec) | Δ vs best competitor | |
|---|---|---|---|
| @ recall 0.90 | |||
| p50 | 0.89 ms | 1.67 ms | -47% |
| p95 | 1.04 ms | 2.38 ms | -56% |
| p99 | 1.21 ms | 2.85 ms | -57% |
| @ recall 0.95 | |||
| p50 | 1.68 ms | 2.92 ms | -43% |
| p95 | 1.98 ms | 3.85 ms | -49% |
| p99 | 2.38 ms | 4.41 ms | -46% |
| @ recall 0.99 | |||
| p50 | 6.66 ms | 17.06 ms | -61% |
| p95 | 7.74 ms | 21.82 ms | -65% |
| p99 | 8.74 ms | 23.20 ms | -62% |
All values are taken at exactly the stated recall: each configuration's own sweep is log-interpolated between its two surrounding measured points (measured values are used verbatim on an exact hit) and the best configuration at that recall is shown — values are never interpolated across different configurations. “—” means no single sweep spans that recall; nothing is extrapolated. Recall is distance-based (ann-benchmarks, tie-aware). Insert/update/delete workloads are not measured.
Interpolated on config — PRISM @0.90: prism-defaults · pgvector HNSW (halfvec) @0.90: hnsw-m24-halfvec · PRISM @0.95: prism-defaults · pgvector HNSW (halfvec) @0.95: hnsw-m24-halfvec · PRISM @0.99: prism-defaults · pgvector HNSW (halfvec) @0.99: hnsw-m24-halfvec
| PRISM | pgvector HNSW (halfvec) | Δ vs best competitor | |
|---|---|---|---|
| Build time | 724 s | 1988 s | -64% |
| Index size | 2.6 GB | 19.1 GB | -86% |
Build stats are for the configuration backing each column's best operating point: PRISM = prism-defaults, prewarmed · pgvector HNSW (halfvec) = hnsw-m24-halfvec, prewarmed.
| Instance type | r8g.4xlarge |
| Hostname | ip-172-31-0-164 |
| CPU | unknown (16 vCPU) |
| Memory | 124 GB |
| OS | Ubuntu 26.04.1 LTS |
| Kernel | 7.0.0-1014-aws |
| rekall | 0.1.0 (a3b5d61 / main) |
| PostgreSQL | PostgreSQL 18.6 (Ubuntu 18.6-1.pgdg26.04+2) on aarch64-unknown-linux-gnu, compiled by gcc (Ubuntu 15.2.0-16ubuntu1) 15.2.0, 64-bit |
| pg_prewarm | 1.2 |
| pg_vectorsearch | 0.1.0-dev (8f4edc4) |
| vector | 0.8.7 |
| k | 10 |
| runs | 3 |
| warmup | 500 |
| num_queries | 10000 |
| S3 archive | s3://rekall-bench/runs/cohere-10m/2026-10-09/r8g.4xlarge-154423/ |
| Index | Type | Build time | Size | Workers |
|---|---|---|---|---|
| hnsw-m24-halfvec | pgvector-hnsw | 1987.5s | 19.1 GB | 15 |
| prism-defaults | prism | 723.5s | 2.6 GB | 15 |
hnsw-m24-halfvec: {"ef_construction":200,"encoding":"halfvec","m":24}
prism-defaults: {"boundary_epsilon":null,"centroid_compression":null,"centroid_fastscan":null,"fan_out":null,"fastscan":null,"fastscan_bits":null,"nlist":null,"rerank_vectors":null,"soar_lambda":null}
instance type r8g.4xlarge vCPU (observed) 16 memory (observed) 123.5 GiB cpu model unknown kernel 7.0.0-1014-aws data directory /var/lib/postgresql/18/main mount point / filesystem ext4 media ebs device nvme0n1 device size 1074 GB ebs volume vol-015a9677ea33d2153 ebs volume type gp3 provisioned IOPS 16000 provisioned throughput 1000 MB/s io scheduler none nr_requests 63 read_ahead_kb 128
checkpoint_completion_target = 0.9 cluster_name = 18/main data_directory = /var/lib/postgresql/18/main effective_cache_size = 96 GB effective_io_concurrency = 256 huge_pages = try jit = off maintenance_io_concurrency = 256 maintenance_work_mem = 51 GB max_connections = 82 max_parallel_maintenance_workers = 15 max_parallel_workers = 16 max_wal_size = 32 GB random_page_cost = 1.1 server_version = 18.6 (Ubuntu 18.6-1.pgdg26.04+2) shared_buffers = 32 GB wal_level = replica work_mem = 1 GB