InventDB

Benchmarks: encrypted, at 10 million rows.

Query and transaction benchmarks over 10 million rows, run in the shipping configuration with AES-256 encryption on, against PostgreSQL 18 and SQLite. Built-in capabilities are compared separately, against PostgreSQL, MongoDB and SQLite.

Two platforms, measured separately and published separately. How we test →

117.7s
143-query set over 10M rows: single client, cold
22.2s
the same 143 queries, warm: a repeat of every one
3,551
queries in the full SQL battery, across 28 categories
10M
records on one encrypted 2-vCPU server

Measured on the dedicated ARM fleet: one Graviton machine per engine, identical spec, the same 10M-record dataset. InventDB runs with AES-256 encryption on. Cold = a query's first execution on an established connection; warm = a repeat of the same query.

Measured August 2026, v0.597

143-query shared set

The same 143 queries in each engine's dialect, over 10 million rows: 2.5M across each of four types. Figures are cold / warm milliseconds summed per category. InventDB runs with AES-256 encryption on; PostgreSQL 18 and SQLite run unencrypted at their tuned defaults, with an index on every column.

143-query shared set · single client · cold / warm ms per category
Category Queries InventDB (in-process)cold / warm msInventDB (client/server)cold / warm msPostgreSQLcold / warm msSQLitecold / warm ms
Basic SELECT7142 / 3113 / 13406 / 398137 / 11
Complex58,137 / 4,1634,143 / 4,1006,629 / 6,53227,810 / 27,617
Compound WHERE123,415 / 1,9382,264 / 1,993999 / 9939 / 5
Distinct61,131 / 991120 / 1192,351 / 2,341221 / 216
Edge Case8308 / 8590 / 90504 / 402661 / 657
Exact Match7581 / 91115 / 1034 / 31 / 0
GROUP BY143,437 / 834847 / 8267,149 / 7,13619,439 / 20,401
GROUP BY+WHERE423,595 / 241255 / 2541,143 / 1,1437,901 / 7,687
HAVING4344 / 313315 / 3102,875 / 2,9127,878 / 7,841
JOIN 2-table1218,967 / 4,1154,296 / 4,29011,673 / 11,40844,717 / 44,496
JOIN 3-table1141,282 / 6,4236,405 / 6,55060,062 / 59,440141,941 / 140,766
JOIN 4-table59,226 / 1,7021,687 / 1,77944,914 / 45,468107,183 / 107,148
LIKE81,570 / 257356 / 2777 / 61 / 1
NULL Handling2393 / 9268 / 63111 / 9757 / 44
ORDER BY123,177 / 717917 / 75148 / 45157 / 139
Pagination6854 / 154150 / 147266 / 24383 / 82
Range11448 / 1654 / 3612 / 55 / 1
Secondary Table9662 / 8484 / 75652 / 638548 / 525
Total, single client143117,669 / 22,24722,179 / 21,777139,807 / 139,209358,746 / 357,636
Total, 4 parallel clients143 / 65,404 / 59,659 / 383,428 / 1,051,993

Four clients run the whole set at once against one shared database; those figures are the average per client, so each engine does four times the work in the time shown. InventDB answers 143 of 143; SQLite answers 139.

Measured August 2026, v0.597

3,551-query full battery

The complete battery across 28 categories, same data and same machine class. Figures are cold / warm milliseconds summed per category.

3,551-query battery · single client · cold / warm ms per category
Category Queries InventDB (in-process)cold / warm msInventDB (client/server)cold / warm msPostgreSQLcold / warm msSQLitecold / warm ms
Basic SELECT48799 / 380276 / 218534 / 507142 / 13
Complex4514,714 / 14,25313,811 / 13,3036,970 / 6,9432,420 / 2,416
Compound WHERE1,86080,123 / 21,17925,336 / 24,9121,051 / 1,03914,769 / 14,720
COUNT DISTINCT4095,696 / 25,49324,804 / 24,72355,964 / 55,84512,836 / 12,888
DISTINCT564 / 6474 / 711,118 / 1,1263 / 2
Exact Match2405,505 / 4,2315,333 / 4,904164 / 16447 / 39
GROUP BY204,931 / 1,4231,450 / 1,4477,765 / 7,76634,291 / 34,318
GROUP BY+WHERE184141,609 / 37,16139,112 / 39,02927,524 / 27,519112,133 / 112,296
HAVING1651 / 5162 / 624,146 / 4,1562,743 / 2,743
IN / NOT IN14837 / 755837 / 7751,511 / 1,5092,116 / 2,117
JOIN + GROUP BY21,332 / 690727 / 7134,218 / 4,19011,413 / 11,388
JOIN + ORDER BY41,965 / 3491,722 / 4598 / 52 / 1
JOIN 2-table93,966 / 419473 / 4741,509 / 1,2381,695 / 1,664
JOIN 3-table6914 / 349381 / 37311 / 72 / 2
JOIN 4-table1349 / 117124 / 1242 / 21 / 1
JOIN 5-table2232 / 173219 / 1818 / 71 / 1
LIKE18012,884 / 11,99412,462 / 12,36710,832 / 10,75517,327 / 17,305
Nested/Array30137 / 40242 / 225
Nested/Object1044 / 727 / 23
NULL Handling16137 / 135149 / 150784 / 784333 / 332
ORDER BY162,156 / 372640 / 41310 / 202 / 1
ORDER BY multi6429,039 / 25,54530,160 / 26,2044,016 / 4,01811,806 / 11,803
ORDER BY+WHERE32012,135 / 9,23911,107 / 10,173178 / 16958 / 49
Pagination805,453 / 3,2783,472 / 3,465162 / 15925 / 11
Projection2852 / 5081 / 807 / 71 / 0
Range2535,163 / 8231,508 / 1,4091,182 / 1,1791,121 / 1,108
Scalar fn52608 / 526591 / 5867,526 / 7,50511,772 / 11,758
Secondary Table66 / 510 / 10333 / 29663 / 10
Total, single client3,551420,899 / 159,103175,190 / 166,872137,534 / 136,915237,123 / 236,986
Total, 4 parallel clients3,551 / 432,441 / 413,178 / 347,439 / 574,517

InventDB answers 3,551 of 3,551; PostgreSQL and SQLite each answer 3,511. Three categories carry most of InventDB’s remaining time here: GROUP BY + WHERE at 23% of the warm total, with ORDER BY multi and COUNT DISTINCT at 16% each. All are published as measured.

Both execution modes

In-process and client/server

InventDB is the only engine here that runs both ways, so it is measured both ways. PostgreSQL has no in-process mode; SQLite has no server mode. Warm totals in seconds.

Warm totals by execution mode · seconds
Suite InventDBin-process InventDBclient/server PostgreSQLclient/server SQLitein-process
3,551 battery, 1 client177.7191.4136.9237.0
3,551 battery, 4 clients458.9481.6347.4574.5
143-query set, 1 client35.837.2139.2357.6
143-query set, 4 clients92.187.6383.41,052.0

The server layer costs little on the large battery and a great deal on the small one. Under four clients on the 3,551-query battery it is faster than running in-process (413.2 vs 432.4 s): one server process with a shared database beats four callers contending inside one process on two cores. On the 143-query set the same four clients cost -9% (59.7 vs 65.4 s): that set is small enough that per-request transport dominates, with far fewer queries to amortise it over.

Transactions

TPC-C

Four warehouses, 10,000 transactions per leg, the full TPC-C mix. Durability matched across engines: PostgreSQL synchronous_commit=on, SQLite WAL with synchronous=FULL, InventDB checkpointing throughout. Transactions per second; higher is better.

TPC-C · 4 warehouses · transactions per second
Leg InventDBin-process InventDBclient/server PostgreSQLclient/server SQLitein-process
Sequential127.875.4181.3387.6
4 threads233.0112.3360.0127.1
Scaling, 4 threads vs sequential1.82×1.49×1.99×0.33×
Transactions completed10,000 / 10,00010,000 / 10,00010,000 / 10,00010,000 / 10,000

Every engine completes all 10,000 transactions with zero errors, and every InventDB figure here comes from a run that passed all eleven exact-accounting identities: balances that must hold to the cent across warehouses, districts and customers, which the other engines do not check at all. SQLite's four-thread throughput falls below its own sequential figure: the single-writer model. A TPC-C transaction is eight or more statements, so a client/server engine pays a round trip on every one of them.

How it compares

Built-in capabilities, side by side

A comparison of built-in capabilities: what ships in the box, without bolting on extra services. It is not a performance or pricing comparison. Verified July 2026 against official docs and release notes.

Built-in capabilities · verified July 2026
Capability InventDB PostgreSQL 18 MongoDB 8 (Community) SQLite
Data model
Schema-free JSON documentsBuilt inJSONBYesJSON1
SQL query languageBuilt inYes— (MQL)Yes
Nested objects & arraysBuilt inJSONBYesJSON1
Reliability
Full ACID transactionsBuilt inYesYesYes
Write-ahead log (WAL)Built inYesYes (journal)Yes
Self-healing corruption recoveryBuilt in— (manual)— (manual)— (manual)
Security & encryption
Encryption at restBuilt in— (disk/TDE)EnterpriseAdd-on (SEE)
Row-level value encryptionBuilt inAdd-on (pgcrypto)Yes (client keys)Add-on (SEE)
Encrypted, queryable indexesBuilt inYes (Queryable Enc.)
Database-managed rotatable keysBuilt in— (external KMS)— (customer-managed)
Role-based access controlBuilt inYesYes
Indexing & performance
Automatic indexingBuilt in— (manual)— (manual)— (manual)
Built-in key-value cacheBuilt in
Search
Exact-match searchBuilt inYesYesYes
Full-text (keyword) searchBuilt inYesYesYes (FTS5)
Fuzzy / typo-tolerant searchBuilt inAdd-on (pg_trgm)Add-on (Atlas Search)
Semantic / vector searchBuilt inExtension (pgvector)Add-on (mongot)Extension (sqlite-vec)
Files & documents
Encrypted file storageBuilt in— (GridFS unencrypted)
Text extraction, 25+ formatsBuilt in
Built-in OCR (image/PDF → text)Built in
File version historyBuilt in
Built-in AI agent
Natural-language Q&ABuilt inAdd-on (SQL-gen only)
Multi-step analysis & reportsBuilt in
Natural-language data editsBuilt in
Scheduled reportsBuilt in
Operations & deployment
Single binary, zero dependenciesBuilt in— (server)— (server + mongot)Yes
Driverless HTTP / REST APIBuilt inAdd-on (PostgREST)Add-on (Data API)
Cross-platform (Win/Linux/macOS)YesYesYesYes
Full-text and keyword search exist in most of these: SQLite FTS5, PostgreSQL and MongoDB text all do it. What differs is the OCR + document-extraction + semantic pipeline in one database.
MongoDB 8 Queryable Encryption is a genuine analog for encrypted values and indexes. What differs is that InventDB's keys are database-managed and rotatable, spanning values, indexes, files and backups, with no client-side key handling.
For vector search and AI the framing is built in vs a bolt-on extension: pgvector, sqlite-vec and mongot are all excellent, but they're add-ons you install and operate.

Verified July 2026 against official docs and release notes; capabilities move fast, so confirm with each vendor.

The rig

One machine per engine

All three are AWS Graviton t4g.large instances: 2 vCPU, 8 GiB RAM, data on an EBS volume, the same shape as the Business Small tier customers run on, and not on a workstation with sixteen cores and a warm file cache.

The three benchmark machines · identical spec, one engine each
Machine Engine Configuration
InventDB rig InventDB, run both in-process and client/server AES-256 encryption on throughout. The columnar cache, the document cache and memory-mapped sealed segments are all on: the shipping default, each sized by the server from the memory the machine reports rather than set by hand.
PostgreSQL rig PostgreSQL 18.4, client/server only synchronous_commit=on, shared_buffers=2GB, an index on every column.
SQLite rig SQLite, in-process only WAL with synchronous=FULL, 128 MB page cache, 4 GB mmap, an index on every column.

PostgreSQL has no in-process mode and SQLite has no server mode, so InventDB is measured both ways and compared with each on its own terms: in-process against SQLite, client/server against PostgreSQL. Comparing an embedded engine against a networked one and calling the difference a win is the easiest way to publish a number that means nothing.

Every releasable build

What runs, every time

The same benchmark legs, on the same 10-million-record dataset restored from a fixed snapshot, never regenerated, so the data cannot drift between releases.

The per-release benchmark matrix
Leg What it is How it is run
Full SQL battery3,551 queries across 28 categories: joins, aggregates, ordering, pagination, LIKE, nested pathssingle-threaded and four-thread, in-process and client/server
143-query shared setThe subset every engine can answer in its own dialect, for a like-for-like comparisonsingle-threaded and four-thread, in-process and client/server
TPC-CThe transaction benchmark (NewOrder, Payment, OrderStatus, Delivery, StockLevel) with exact accounting checkssequential and four-thread, in-process and client/server

Alongside the benchmarks, every releasable build runs the functional suites: smoke, regression, the QA campaign, the API harness and the engine's own test batteries. A build that is fast and wrong is not a release candidate.

Method

How the numbers are kept honest

Most of the work in a benchmark is not running it. It is making sure the thing measured is the thing you think was measured.

Rules the rig enforces
RuleWhy it exists
Row counts are cross-checked between enginesEvery query's result count is compared across all three. An engine that quietly returns fewer rows fails the leg rather than winning it.
Correctness tests check the answer rather than the row countA wrong top-100 still has 100 rows, and a wrong COUNT still returns one row. Ordered queries are checked against the true minimum and maximum, and against the number of qualifying rows beyond the last one returned.
Every engine gets the same schema workInventDB indexes every property by design, so the comparators are given an index on every column too. A primary-key-only schema would measure a different amount of write work.
Durability is matchedPostgreSQL runs synchronous_commit=on; SQLite runs WAL with synchronous=FULL. No engine may acknowledge a commit the others are still flushing.
Benchmark harnesses are matched tooThe TPC-C harnesses were single-warehouse by construction, which turns the benchmark into a single-row contention test. All three now take the same scale and thread-routing settings.
A result is not believed until it repeatsAn outlier is re-run, and a suspected regression is re-measured against a control build in the same environment before it is attributed to any change.
Reverted work is published tooThe release notes record optimisations that were measured and thrown away, two of which made a category several hundred times slower. The measurements are the useful part.

Methodology

How we ran it

The setup, in full

Two platforms are published on this page. The Linux · ARM tab is the reference: three dedicated Graviton machines, one per engine, identical spec, the same 10M-record dataset; see how we test. The Windows tab is the same suites on a single workstation with four cores. Different hardware, so the two are never mixed and never totalled together.

10M records, encryption on, and the engine in its shipping configuration: the columnar cache, the document cache and memory-mapped reads of sealed files are all on, each sized by the server from the memory the machine reports. Earlier releases were measured with those caches switched off; the two are not comparable, and only the current configuration is published here. Each suite runs twice: with a single client (one connection, queries in sequence) and with 4 parallel clients each running the whole battery against one shared database. Those labels count callers rather than internal threads. Cold is a query's first execution on an established connection; warm is a repeat. Every server is warmed before its leg. The two suites, 143 queries (18 categories) and the 3,551-query battery (28 categories), are never totalled together. PostgreSQL 18 and SQLite ran over the same data, driven the same way.

How PostgreSQL was configured. 23 indexes, covering the same columns InventDB indexes plus every join key; work_mem 256 MB, maintenance_work_mem 1 GB, and ANALYZE run on all four tables before measuring. shared_buffers was left at its default. Where PostgreSQL has the better index for a query it wins, and those categories are published as measured, Exact Match and Range among them.

The operating system favours InventDB here. These runs are on Windows, where PostgreSQL's process-per-connection model costs more than it does on Linux. The effect is largest in the 4-parallel-client leg, so treat the parallel PostgreSQL figures as a Windows result rather than a ceiling. The Linux results are measured separately and published in the Linux · ARM tab.

Common questions

How was this benchmark run?

On three dedicated ARM machines, one per engine, with encryption on and the engine in its shipping configuration, over a 10M-record dataset, in two legs: a single client and 4 parallel clients running the same battery at once against one shared database. Cold is a query's first execution on an established connection; warm is a repeat. Every server is warmed beforehand. PostgreSQL 18 and SQLite were run over the same data, driven the same way.

How do the InventDB and PostgreSQL numbers compare?

On the 143-query shared set, single client: InventDB 117,669 ms cold / 22,247 ms warm; PostgreSQL 18 139,807 / 139,209. On the 3,551-query battery, single client warm: InventDB 159,103 ms in-process and 166,872 ms client/server; PostgreSQL 136,915 ms client/server. PostgreSQL is ahead on the 3,551-query battery and behind on the 143-query set; both are published as measured. Per-category figures are in the tables above.

How do the InventDB and SQLite numbers compare?

On the 143-query shared set, single client: InventDB 117,669 ms cold / 22,247 ms warm; SQLite 358,746 / 357,636. Per-category figures are in the table above.

Do the numbers vary by category?

Yes, substantially. Category totals span several orders of magnitude across all three engines, and the ordering between them differs by category. Every category is published in the tables above, including those where InventDB records the higher number.

Which battery do these numbers come from?

Two separate suites are published: a 143-query shared set across 18 categories, and a 3,551-query full SQL battery across 28 categories. They are different suites and are never totalled together.

Can I reproduce these numbers myself?

Yes. Create your own encrypted database, load your data and run whichever queries you care about: same SQL, same engine. The capability comparison further up is a separate matter: public sources as of July 2026, describing what ships built in rather than speed.

Run your own numbers.

Create your own encrypted database, load your data and measure it yourself. The same SQL and API apply from a few thousand rows to 250 million records.

See pricing