Skip to main content
Comparisons

ScramDB against everything you are running today

One live copy of your data serving transactions, analytics and AI at once, on a single binary that speaks PostgreSQL. Here is what that replaces, and what it beats.

377xfaster than PostgreSQL on the same queries
31.56sfor a full analytical workload over 100M rows
6.2xsmaller on disk than PostgreSQL
#1fastest transactional database we measured
Head to head

Pick your incumbent

Same data, same machine, same queries. Pick the database you are trying to get away from.

Transactional databases

The database you are probably running
ScramDB vs PostgreSQL
377x faster

Same wire protocol, same drivers, same SQL. A columnar engine and native-code execution underneath.

Read the comparison
InnoDB was never built to scan
ScramDB vs MySQL
696x faster

No columnar storage, no vectorized execution, no parallel query in the community server. Every analytical scan is a row walk.

Read the comparison
Documents are not a scan format
ScramDB vs MongoDB
SQL, real joins, unbounded transactions

Documents are read whole, there is no columnar scan engine, and a transaction comes with a documented time limit and a document count guideline.

Read the comparison
The analytics engine is still alpha
ScramDB vs MariaDB
4686x faster

ColumnStore has shipped at beta integration for years, and the new DuckDB engine is labelled alpha and not for production.

Read the comparison
The fast parts are the expensive edition
ScramDB vs SQL Server
Columnar analytics with no edition to buy

Columnstore memory and batch-mode parallelism are capped outside Enterprise, and Enterprise is licensed per core.

Read the comparison
The columnar engine is a paid option
ScramDB vs Oracle Database
Columnar analytics with no licence meter

Database In-Memory is an Enterprise-only paid option, licensed per processor across every core on the server. ScramDB is columnar by default.

Read the comparison
One writer, one file, one machine
ScramDB vs SQLite
407x faster, and it is a server

SQLite allows one writer at a time and its own documentation says it competes with fopen(), not with client-server databases.

Read the comparison
A PostgreSQL fork with a column store bolted on
ScramDB vs openGauss
9x faster, in one engine

openGauss makes you choose row store or column store per table, and serializable is implemented as repeatable read.

Read the comparison

Analytics engines

An analytics engine, not a database of record
ScramDB vs ClickHouse
One system instead of two

ClickHouse cannot hold your transactions, so it lives next to a real database with a pipeline between them. ScramDB is both.

Read the comparison
Time series is not the whole workload
ScramDB vs TimescaleDB
18x faster

A good Postgres extension with a hybrid row and columnstore, still bound by the Postgres executor underneath.

Read the comparison
A library in one process, not a database for your team
ScramDB vs DuckDB
A server your whole application can share

DuckDB is embedded in a single process and allows one writer process at a time. There is nothing for a second service, a second developer or a BI tool to connect to.

Read the comparison
An MPP cluster for one machine’s worth of work
ScramDB vs StarRocks
Faster, on one process

StarRocks needs frontend and backend nodes before it serves a query. ScramDB is one binary, and it answered the same workload faster.

Read the comparison
A sync target for the database you already run
ScramDB vs Apache Doris
Faster, and it is the database

Doris is positioned to receive upserts from your operational database. ScramDB is the operational database, and it answered the same workload faster.

Read the comparison
No updates, five services, a ZooKeeper
ScramDB vs Apache Druid
Faster, and you can update a row

Druid does not support single-record updates by primary key, and a production cluster is five service types plus ZooKeeper, a metadata database and deep storage.

Read the comparison
Joins are a second engine you turn on
ScramDB vs Apache Pinot
Faster, with SQL that just works

Pinot needs controller, broker, server and ZooKeeper before it answers, and joins only exist in its multi-stage engine.

Read the comparison
A search engine doing a database’s job
ScramDB vs Elasticsearch
Faster, with real joins and real transactions

No cross-document transactions, updates are reindex operations, and joins are either denormalisation or a single-field lookup.

Read the comparison
Closed source, and frozen at PostgreSQL 12
ScramDB vs Greenplum
Open to run, and current

Greenplum stopped being developed in the open in 2024 and its engine tracks PostgreSQL 12. ScramDB answered the same workload 24x faster.

Read the comparison
A query engine with no database under it
ScramDB vs Trino
11x faster, and it stores your data

Trino queries other people’s files through connectors. It owns no storage, holds no transactions and needs a coordinator plus workers.

Read the comparison
A batch processing framework, not a database
ScramDB vs Apache Spark
10x faster, with no cluster manager

Spark is a driver, executors and a cluster manager, over storage it does not own and transactions it does not provide.

Read the comparison
No DELETE, no foreign keys, HA behind a licence
ScramDB vs QuestDB
A general database, not a time series one

QuestDB has no row-level DELETE statement, no foreign keys, triggers or procedures, and replication and RBAC are Enterprise features.

Read the comparison
A warehouse that needs three components
ScramDB vs Databend
Faster, on one binary

Databend needs a Raft meta service, query nodes and an object store before it answers, and it is a warehouse rather than your database.

Read the comparison

Distributed SQL

Distributed SQL without the analytical engine
ScramDB vs CockroachDB
347x faster

Raft-replicated ranges over an LSM row store. Vectorized execution on top of a layout that was never columnar.

Read the comparison
HTAP with two copies of your data
ScramDB vs TiDB
112x faster

TiKV holds the rows, TiFlash holds a second columnar copy, and Raft Learner replication runs between them.

Read the comparison
PostgreSQL compatible, analytically outsourced
ScramDB vs YugabyteDB
1638x faster

DocDB is an LSM row store with no columnar engine. Heavy analytics is documented as a job for an external system.

Read the comparison
The closest thing to a peer, behind a licence
ScramDB vs SingleStore
Faster, and without the licence

The other engine that really does serve both workloads. Proprietary, capped at 8 vCPU in the free tier, and slower here.

Read the comparison
Sharded PostgreSQL is still PostgreSQL
ScramDB vs Citus
55x faster, on one node

Citus spreads Postgres across a coordinator and workers. Every shard is still a row heap read by the Postgres executor.

Read the comparison
START TRANSACTION is accepted and ignored
ScramDB vs CrateDB
9.8x faster, with real transactions

CrateDB speaks the PostgreSQL protocol but does not support multi-statement transactions: it accepts the statement and ignores it.

Read the comparison
Three servers before production
ScramDB vs OceanBase
75x faster, on one process

OceanBase needs at least three servers for production and fixes a tenant’s compatibility mode at creation. ScramDB is one binary.

Read the comparison

Cloud warehouses

What a benchmark cannot measure

The rest of the database

Speed is the part that fits in a table. This is the part that changes how you work.

One live copy
No pipeline, no second database

Your dashboard reads the row your transaction wrote a millisecond ago, because there is only one copy of it. Nothing to load into a warehouse, nothing to keep in sync, no staleness window to explain to anyone.

Speed
Warehouse speed on live data

A full analytical workload over 100 million rows in 31.6 seconds, on a 16 vCPU machine, while transactions run against the same data. That is 377 times faster than PostgreSQL answered the same queries.

Footprint
A sixth of the disk

The dataset that occupies 99 GiB on PostgreSQL occupies 16 GiB here. Less storage to pay for, less to back up, less to move, and less to read every time you ask a question.

Branching
Fork production in a second

CREATE DATABASE staging CLONE production returns immediately and costs nothing until you write to it. Give every developer, every test run and every AI agent its own copy of production, then throw it away.

Time travel
Open the database as it was

Point at any past timestamp and query it with ordinary SQL: what did this customer see on Tuesday, when did this value change, what did the table look like before the migration. Restore targets a timestamp too, to and from S3, Google Cloud Storage or Azure.

Agentic API
Agents connect to the database, not to a wrapper

A semantic layer ships inside the engine and speaks MCP, so an agent can ask what the data means, ask whether a question is even answerable, get the answer, and see the exact SQL that produced it. Nothing to deploy beside the database.

Agent safety
Agents inherit your permissions

Every agent call runs as a real database role, so table grants, column privileges and row-level security apply to it exactly as they apply to a person. Filters are structured values rather than strings, so there is nothing to inject.

Streaming
Rows move, they do not pile up

Results start flowing as soon as the first rows are ready, and keep flowing at the speed you can take them. A big join or aggregation does not have to finish before you see anything, and one slow reader never stalls the rest of the database.

Ejder
The self-driving engine

Ejder is the self-driving layer. It fits itself to the machine it lands on, learns the shape of your data as it changes, picks the fastest way to answer each query, and makes hot queries faster while they run. The database tunes itself as the workload moves, so most deployments never touch a config key.

Correctness
Serializable, not almost

Transactions up to serializable isolation, so the concurrency anomalies you would otherwise design around simply cannot happen. Distributed transactions commit or roll back as one, and survive a client disconnecting mid-commit.

Scale
One node until you need more

The same binary runs standalone and joins a cluster. No minimum node count to reach before production, and no separate edition to migrate to when the second machine arrives.

Global scale
One database, several continents

One database across several continents. Regions stay in agreement with full transactional guarantees between them, reads are served close to the people asking, and queries move only the data they have to move across the ocean.

GPU
The accelerator you already paid for

Analytical execution can run on the GPU as well as the CPU, on the same data, through the same SQL. No separate engine, no export, no rewrite of the query.

Distributed commit
It commits everywhere or nowhere

A transaction that spans three machines commits everywhere or nowhere, and finishes even if the client drops halfway through. Distributed does not mean weaker guarantees here.

Elastic cluster
Add and drain nodes while it runs

Bring a node in and it takes its share of the data. Drain one with a single statement and it hands its work over before it leaves. No downtime window, no rebalancing weekend, no separate operator to install.

Backups
Restore to a moment, not a nightly file

Rewind to any moment, not to last night’s dump: name a timestamp and get the database as it was. Backups and restores talk to S3, Google Cloud Storage and Azure directly, with nothing else to install.

Security
Access control that reaches the row

Roles and grants down to individual columns, and policies that decide which rows each person may see and change. The same rules bind people, applications and AI agents, because they are all just roles.

Packages
Install capability the way you install a library

A package registry of ready-made extensions installs into the database with one command: text and embedding helpers, format codecs, domain functions. Publish your own the same way, and they run in the same sandbox with the same limits.

Observability
Metrics your monitoring already understands

Prometheus metrics and a health endpoint on port 9090 from the moment it starts, plus query plans on demand. Nothing to bolt on, nothing to configure before you can see what the database is doing.

No meter
Ask as many questions as you like

No per-query bill, no bytes-scanned charge, no compute credits ticking while a warehouse stays warm, no per-core licence to count. The cost is the machine, whether it answers one query today or a million.

Compatibility
Your PostgreSQL client just connects

Connect with psql, psycopg, SQLAlchemy, Django, JDBC, .NET, Go, Rust, Node and every BI tool that speaks PostgreSQL. Joins, window functions, CTEs, foreign keys, triggers, stored procedures, roles and row-level security all work the way you already wrote them.

Programmable
Functions in the language you already write

Write functions in JavaScript, Python or Ruby with no toolchain, or ship compiled packages built from Rust, Go, C, C++ and TypeScript. They run sandboxed with only the permissions you grant and hard limits on what they can consume.

Operations
One file, one command

A single binary with no dependencies. Install it with one line, type scramdb, and it picks its own config, listens on the postgres port 5432, runs in the background and exposes metrics and health for your monitoring.

By category

Why there are four other columns

Every other system here belongs to a category that was designed around half of the problem. The transactional databases cannot scan, the analytical engines cannot hold a transaction, the distributed SQL systems replaced the storage engine without replacing the executor, and the HTAP systems solved it by keeping your data twice.

ScramDB
UTAP
OLTP
Postgres, MySQL
OLAP
ClickHouse, DuckDB
Distributed SQL
CockroachDB, Yugabyte
HTAP
TiDB, SingleStore
Transactions and analytics on one copyyesnonopartlypartly
Columnar storage with native-code executionyesnoyesnopartly
Serializable isolationyesyesnoyesno
PostgreSQL wire protocolyesyesnopartlyno
Foreign keys, triggers, procedures, RLSyesyesnopartlypartly
Instant branching and point-in-time forksyesnononono
GPU-accelerated executionyesnononono
Streaming results: answers start arriving before the query finishesyesnopartlypartlypartly
Ejder: a self-driving engine that tunes itself as the workload changesyesnononono
Programmability: sandboxed functions in your languageyespartlypartlypartlyno
Clustering across regions, on the same binaryyesnonoyespartly
Semantic AI: an agent interface inside the engineyesnononono
Production on a single nodeyesyesyesnono

Run it yourself in one line

One static binary, no dependencies. It picks its own config, listens on the postgres port 5432 and runs in the background.

$curl -fsSL https://scramdb.com/install | bash

Quick start · How the engine works · Talk to us

A full analytical workload over 100 million rows of real web analytics data, run on a 16 vCPU AWS instance, measured 5 September 2026. Ours is a single ScramDB node in its stock configuration, with the GPU off and nothing tuned for the test. Rival figures are those systems’ own published results for the same instance type. These are the numbers as of that date, not a permanent scoreboard: the engine is tuned continuously and it has got faster through every round of this work, so a later run should read better than this one.