Security Data Works

The Capability Matrix · the benchmark behind the scores

Independent benchmarks. Code in the open.

You've read the benchmark slide where the vendor's engine wins by 40× and there's no way to check. Every number on this page runs the other way: methodology public, code public, corpus synthetic — clone the repo and re-run it on your own hardware before you believe me. The flagship finding is two-regime, and I publish both halves: the schema-on-read index wins the simple indexed lookups, and the lakehouse engines win the hunting-shaped aggregations by 5–62× (Tier B, single host, 10M events, CV-gated, identical answers verified).

These benchmarks are the hard evidence behind the Capability Matrix scores, one product with the lab as its measurement engine. They feed the open research notebook, where each measured result becomes a tracked hypothesis with an evidence tier and a record of what would change the answer.

What's below is twenty-two first-party benchmarks — five published and seventeen shipping as a first pass, plus an FSI compliance human-hours study scaffolded and a Vortex-vs-Parquet test install-blocked — twenty-one of them with public code you can clone and re-run and one held under NDA because its comparison set includes commercial software whose licensing restricts publishing the results. The first nine are written up in full and thirteen more in brief with their code, all in the selector below. These are measurements I ran behind the claims on this site, not other people's numbers I'm pointing at.

The stack, measured together

MOAR stack benchmarks.

Most of the benchmarks on this page measure one open stack from different angles: the same object storage, Iceberg table, swappable catalogs and engines, and OCSF routing the MOAR architecture describes. Taken together they answer one question, whether the architecture actually runs and whether its numbers survive checking. The stack-level results:

What's measuredResult
Engine answer-equalityFive engines (DuckDB, Trino, ClickHouse, StarRocks, Dremio), three catalogs (Iceberg REST, Nessie, Lakekeeper), and two table formats (Iceberg, DuckLake) return the identical answer (1,000 rows / 125 RDP) over the same data.
Reader correctnessTwo of thirteen Parquet readers returned a wrong count with no error or warning on a file the others read correctly, which is why answer-equality runs as a standing gate rather than a one-time test.
Query speed vs. SIEMTwo-regime: the lakehouse engines ran the hunting-shaped aggregations on a 10M-event Zeek workload 5–62× faster than a schema-on-read SIEM (46.8× native / 10.1× Iceberg on the five-query average, single-node Tier B), and the index wins the simple lookups, detailed below.
Compression9.0× under ClickHouse blanket ZSTD-22 on the pinned 10M-event Zeek corpus; Iceberg Parquet lands 8.5× against raw JSONL on the same corpus, the anchor for the calculator below.
Storage vs. SIEMAbout 7× smaller than an OpenSearch index on identical OCSF data, answers identical (1.6 vs 11.5 MB at 200,000 events).
Query latency4 to 14 ms at a million rows on a single host across the gated workloads.
Cross-tool data healthThe best single source of record recovers 47.7% of an environment's true state; a freshness-and-authority merge across tools reaches 75.6%, and the residual 24.4% is the blind spot no tool covers (both reproducible across 12 seed re-draws, CV 0.3%).
Normalization fidelityRoutine SOC queries hold under coarse normalization (+0.000); the adversary-relevant tail degrades far more — +0.188 on the de-gamed run against real MITRE APT29 telemetry with unmodified SigmaHQ rules (the adversary tail's recall-loss is ~2× that of routine queries, 0.35 vs 0.16), and a larger +0.719 on the gameable synthetic testbed — because coarsening discards the evidence those queries need.
Chain of custodyIceberg time-travel returns the exact state as of each immutable snapshot, the lineage a mutable SIEM index can't give you (Reg SCI / SEC 17a-4(f) grade).

Single-host, first-party measurements throughout, several on synthetic but controlled testbeds and graded Tier B (reproducible, first-party); read latency and throughput as architecture rather than cluster-scale promises, since the scale sweeps are separate lab work. The consolidated write-up sits on the MOAR proof page.

The benchmarks, one at a time

Nine full write-ups, thirteen more in brief.

Pick one from the list — each opens its write-up: the workload, the numbers, the caveats, and the code or PDF to re-run it yourself. The nine full write-ups come first, then thirteen first-pass results. The flagship Zeek result is open by default.

Published benchmark

On a 10M-event Zeek workload, the finding is two-regime: the index wins the simple lookups, and the lakehouse engines win the hunting-shaped aggregations by 5–62×.

Identical workload (10M Zeek conn.log events), identical hardware, identical queries. Methodology and code published; reproducible on commodity hardware.

The headline numbers.

Two regimes, reported both ways: a schema-on-read index wins the simple indexed lookups (protocol distribution, long-duration connections), and the lakehouse engines win the hunting-shaped aggregations by 5–62×, averaging 46.8× native and 10.1× over Iceberg across the five-query suite (Tier B, single host, 10M events, CV-gated, identical answers verified). The baseline is OpenSearch 2.18.0; the per-query spread behind the band is top-source-IPs 21× and port-scan 62× on ClickHouse native MergeTree, 5.4× and 14× on ClickHouse-over-Iceberg, while the index takes protocol-distribution 3.4× and long-duration 1.8× over native. Text search is the index's other regime, and a follow-up bench shows even that splits three ways: ClickHouse's full-text index ties OpenSearch on whole-token filtering, the inverted index wins substring-within-a-token, but the columnar engine is the correct one for regex over token-spanning content like base64, where the analyzer's tokenization fragments the value and the index silently undercounts (it returned 3,159 of 7,946 planted blobs while the columnar scan returned all of them). Seven trials per query throughout. ClickHouse's columnar store under blanket ZSTD-22 lands a 9.0× reduction against the raw JSON on the pinned 10M-event Zeek corpus — the columnar layout and the codec together rather than the codec alone. The schema-on-read SIEM's compressed footprint on the same data is roughly 2,385 MB, a 1.4× factor.

The scaling profile is informative. On the early single-query benchmark the schema-on-read SIEM ran 3.47 seconds at 1M events and 27.52 seconds at 10M events — an 8× latency increase for 10× the data, worse than linear, while ClickHouse stayed sub-second. (The CV-gated five-query re-run summarized below is the rigorous headline; the worse-than-linear scaling is the durable point here.) The performance gap widens as data volume grows, which is the opposite of the direction per-GB-ingested licensing models need it to scale.

The workload.

Zeek conn.log is the per-connection network telemetry record produced by the Zeek (formerly Bro) network security monitor — one of the most common high-volume security data formats in production SOCs. The benchmark loads 10 million conn.log events with realistic field distributions, spread across the standard analytical workload shape: time-bucketed aggregation, top-talker queries, protocol analysis, distinct-host counts, and a cross-source JOIN with simulated SIEM alerts.

Five queries, ten iterations each for statistical stability. Hardware: single-node Docker Compose on WSL2, 32 GB RAM, 16 cores. Both engines configured identically — same row counts, same memory limits, same query suite, same iteration count. No per-tool tuning was applied beyond the documentation defaults for either side.

Reproducibility.

The benchmark repository contains: Docker Compose definitions for ClickHouse, the schema-on-read SIEM, and the additional engines tested (Trino, Dremio, StarRocks); data generation scripts that reproduce the Zeek conn.log distribution; the Python query runner; the methodology document; the analysis JSON.

Reproducibility isn't a marketing line. The repository is shared under NDA with engagement prospects and qualifying reviewers; running it on your hardware should land within statistical variance of the published numbers. If it doesn't, the discrepancy is a contribution to my understanding and gets folded into a result update with the new evidence. The reference implementation isn't published publicly because the comparison set includes commercial software whose licensing terms restrict third-party publication of comparative test results — a constraint I respect rather than work around.

Download

The methodology PDF.

Hardware spec, workload definition, query suite, scaling profile, statistical-confidence detail, and the documented caveats for where the result generalizes and where it doesn't. v1.0, 2026-05. Roughly ~5 pages, no email gate.

Download methodology (PDF) →

For NDA-gated reference-implementation access (Docker Compose, data generators, query runner) — book a discovery call or email jeremy@securitydataworks.com with subject Benchmark NDA request.

Where it breaks

Architectures fail at an edge, not at a row count.

The benchmarks above ask which architecture wins at a fixed point, but the question that decides a migration is inverted: where does the architecture you're running break, how much warning do you get, and what's the reversible next move. Re-reading the whole catalog that way produces a map — three architecture regions, the measured edges between them, and the failure shape at each edge, which matters because a graceful edge announces itself in the latency tail quarters ahead while a cliff gives no warning at all.

2D map: hot data scale (1M to 1B events) against concurrent demand. Three regions (embedded single-node, single-node ceiling band, single-host OLAP server) with measured marks: the schema-on-read index's hunt-shaped edge at 10M, the 100M per-workload crossover, DuckDB's shape-dependent 1B crossings, a join cliff and a silent-wrong hazard inside the regions, and retention/ingest as side chips. All coordinates one host, Tier B.

Every edge on the map except the cliffs gives warning, and each one has a signal you can watch for in your own environment, which is the honest way to use one-host coordinates: what travels is the ordering and the failure shape, not my absolute numbers. Seven questions you can answer from your own telemetry this week, one per dimension:

  1. Scale — did your slowest routine query's p95 grow faster than your hot table's row count over the last two quarters?
  2. Mix — is scheduled-cycle utilization (total scheduled-search runtime per cycle divided by cycle length) above roughly 0.7 and rising?
  3. Concurrency — is busy-hour p95 more than about 3× off-hours p95, and growing with headcount?
  4. Joins — does any correlation search die while its single-table components return in seconds? This is the one edge that gives no curve: it's a cliff, and the fix is a layout decision rather than a scale threshold.
  5. Retention — what fraction of your data older than 90 days was actually queried last quarter, and at what hot-tier $/GB against an S3-class price?
  6. Ingest — does source-to-queryable lag ever exceed your fastest scheduled detection's interval?
  7. Sources — how many production sources have no owned, tested parser? The map draws this edge dashed, because it's practitioner evidence rather than a lab measurement.

I'd rather you measure these than take my coordinates. The public stack ships a runnable data-health gate (./moar healthcheck), and the public suites behind this map publish their methodology so you can point them at your own environment (the one NDA-held benchmark above is the exception, for the licensing reasons it documents). If measuring is itself the missing capacity, that is what the Data Health Validation engagement exists for — the done-for-you version of the same questions.

Model it for your workload

Storage compression ROI calculator.

The 8.5× Iceberg Parquet compression result against raw JSONL on the pinned 10M-event Zeek corpus is the benchmark observation (ClickHouse's blanket-ZSTD-22 store lands 9.0× on the same corpus). Plug in your own daily ingest volume, current per-GB-month storage cost, and retention to see how the result scales. Storage cost only; licensing and compute aren't modeled here.

Pre-compression. Volume that hits storage today.

S3 Standard ≈ $0.023. Splunk indexed ≈ $3–10.

Typical SOC: 12–24. Regulated: 84 (7 yr).

Current

monthly storage at steady state

With 8.5×

monthly after compression

Annual savings

3-yr:

The 8.5× ratio is Iceberg Parquet against raw JSONL on Zeek-shaped network telemetry. Other log shapes vary: endpoint telemetry and identity events typically compress less, cloud control-plane events typically compress more. The number is directional for your workload, not precise. The bigger gap on Splunk-licensed deployments is per-GB-ingested licensing rather than storage; this calculator doesn't model that.

Compare architectures

The storage line, side by side.

The same inputs, run against the two architectures this site examines: indexed-SIEM storage at its list-price rate, and a lakehouse on object storage with the measured columnar compression applied.This models the storage line only; it is not a TCO model. Ingest licensing (usually the bigger line on a SIEM bill), compute, egress, and people aren't in it, so read the output as a single line item on a much larger bill.

Indexed list price runs $3–10 (Tier C).

S3 Standard ≈ $0.023.

Indexed SIEM

monthly; raw bytes at the list storage rate (Tier C basis)

Lakehouse on S3

monthly; 8.5× columnar compression, then object rates (Tier B measured)

Multiple

computed from your inputs; combines the rate gap and compression, storage line only

For calibration against the published figures: the widget combines two effects at once, the list-price rate gap and the 8.5× compression, so at the default inputs its output runs well above either published anchor, and that is the honest reading of what list-price economics look like before any discounting. The conservative brackets this site actually carries are the 130–227× list-price multiple on the raw storage line (Tier C, carried conservatively, with compression deliberately excluded) and the lab's measured floor of 14.8–96.7× (Tier B, counting both the fewer bytes an open format writes and its cheaper price per byte), which works out lower than any list-rate comparison because it uses measured SIEM-side economics rather than list rates. The 8.5× compression is the flat-Zeek result and is corpus-dependent (endpoint and identity telemetry typically compress less, cloud control-plane events more), so treat the lakehouse arm as directional.

How the lab runs benchmarks

Five principles. Documented before any tool runs.

Reproducibility before performance.

A benchmark result that can't be re-run isn't a benchmark; it's an opinion. Every published result ships with the methodology document, the containerized environment definition, the data generators, the query suite, and the analyzed output. A practitioner with the same hardware and same data can re-run the experiment and verify the number independently. The reference implementation is shared under NDA with engagement prospects and qualifying reviewers — not published openly, because the comparison set includes commercial software whose licensing terms restrict third-party publication of comparative benchmark results. The methodology, the result, and the reasoning are public; the executable artifact is gated by a one-page NDA.

Identical workload across candidates.

Workload and queries are defined and pinned before any tool is run. No per-tool tuning advantage; the same query suite runs against the same data on every candidate engine. Vendor-recommended configurations are tested as additional rows in the result table — labeled clearly as vendor-recommended — rather than folded silently into the headline. The point is to characterize each tool's behavior on the workload, not to engineer the most flattering possible result for any one of them.

Documented caveats.

Every result ships with what was tested, what wasn't, and which workloads the result generalizes to. The benchmark is single-node; production environments typically run multi-node, and multi-node behavior is still outside what this suite captures. Single-node joins, though, are no longer an open question. At single-node SOC scale the spread between compliant engines is compressed: every engine answered the SOC join suite in under 1.5 s (Tier B, single host). I don't name a winner at this scale, and TB-scale vendor claims are a different regime this bench neither confirms nor refutes — engine choice mostly turns on catalog maturity, concurrency behavior, and operational cost. The benchmark covers analytical aggregation queries; full-text-search-dominated workloads aren't in the query suite, and the result generalizes less cleanly to those. The benchmark uses one log type (Zeek conn.log); other log shapes (endpoint telemetry, cloud control plane, identity events) carry their own performance characteristics. The caveats are the part that lets a reader know whether the number applies to their environment.

Vendor cooperation invited, not required.

Every vendor whose product appears in a benchmark is invited to review the methodology and propose configuration changes before publication. Vendor-proposed configurations are tested and reported as additional result rows, labeled clearly. The lab doesn't accept funded benchmarks, doesn't allow pre-publication vetoes, and doesn't allow vendors to dictate workload selection — but the methodology review is open, and that openness is part of why the published numbers survive contact with the vendors after release.

External review on annual cadence.

Once a year, an outside practitioner with the relevant standing — security data engineer, OCSF contributor, or analyst with quantitative-benchmark expertise — audits the lab's published results under NDA. They get the same access an engagement prospect gets: full methodology, full reference implementation, the underlying analysis JSON. Their signoff drives corrections to the public results. The first annual external review is scheduled for Q4 2026; the reviewer will be named here, with any flagged issues, when that review completes. Until then this is a forward commitment, not a claim of a signoff that already exists.

What we changed our mind on

The benchmark headline doesn't carry the cost story alone.

For most of 2025, the operational reading of the benchmark was straightforward: ClickHouse is 145× faster and meaningfully cheaper than the schema-on-read SIEM on equivalent workloads. Both halves of that statement need revising. On speed, the CV-gated re-run replaced the single-query 145× with the two-regime finding: the index wins the simple lookups, and the lakehouse engines win the hunting-shaped aggregations by 5–62×, a 46.8× native / 10.1× Iceberg five-query average — the advantage is real but query-shaped, not one flat number. On cost, the framing is more complicated than the early write-ups admitted, and the page where it gets revised is the lab page itself, not a footnote elsewhere.

ClickHouse is cheap versus per-GB-ingested licensing models. 30–90% cost reduction is documented across multiple production deployments — Huntress, Uptycs, Hunters, Panther — and reproduces in TCO modeling. ClickHouse is comparable to Snowflake or Databricks SQL at sustained TB/day workloads, where the managed pricing converges. ClickHouse is structurally more expensive than Iceberg-on-S3 with a separate query engine, because the MergeTree format duplicates data already storable in open formats on S3, the compute and storage scale together rather than independently, and the replication overhead multiplies storage cost. This is the finding the Capability Matrix accounts for directly, which is why it lowers ClickHouse on the cost-led and federated archetypes rather than on the latency-dominated one, so the high latency ranking under Archetype A and this cost admission are scoring the same engine against different criteria, and they agree rather than conflict.

The updated framing the lab uses today: the benchmark validates the performance claim cleanly. The cost claim only carries when the comparison baseline is named — versus the legacy schema-on-read licensing model specifically, not in the abstract. Production deployments that lean ClickHouse-first on hot tier and Iceberg-on-S3 on cold tier are an emerging pattern that captures both the latency advantage and the open-format cost economics. The lab's planned Q4 work on streaming write maturity into Iceberg is partly aimed at characterizing this hybrid shape. It's also why the Capability Matrix ranks ClickHouse first only under the latency-bound Archetype A — the Zeek-heavy SOC, where query speed is weighted 30 and storage cost is not a scored criterion — and reorders toward Iceberg-native engines under the cost-led and federated archetypes; the matrix and this benchmark agree that ClickHouse wins where latency is the design center, not where cost is. The 2026-06 engine-join bench pushes the same direction from the join side: at SOC single-node scale (Tier B, single host, 10M–60M-row tables) every engine answered the SOC join suite in under 1.5 seconds, and the 53.0M-pair large-large correlation join landed in a statistical three-way tie at roughly 0.86s across StarRocks and both ClickHouse arms, so what security teams need from an engine at that scale is manageability, and the choice should ride on catalog maturity, concurrency behavior, and operational cost rather than on the join-latency war.

Cadence and access

Quarterly. Public methodology, paid synthesis.

One tool-eval report per quarter. The topic is announced one quarter ahead so vendors can review the methodology and prospective clients can request scope adjustments before the workload is pinned. The benchmark itself ships in the quarter it's announced for: Q3 catalog comparison runs across July, August, and September with the report landing late September.

The benchmark methodology, code, and headline numbers are published openly to GitHub. The synthesized report — the recommendation per environment archetype, the workload-shape sensitivity analysis, the TCO modeling layered on top of the raw numbers — is included in paid engagements above $25K. The split is intentional: the benchmark is a public good; the synthesis is the engagement deliverable.

The lab also accepts ad-hoc benchmark proposals from prospective clients during engagement scoping. If the workload archetype on the table doesn't have a published benchmark answering the central question, the engagement can include a workload-specific run. The methodology rigor is the same as the published benchmarks; the result publishes on the lab page after the engagement concludes.

Turn a published benchmark into a decision for your workload.

The matrix scores these engines against your environment's constraints — and every benchmark here is public and reproducible on your own workload, no engagement required.