questions:16 layers:6 mode:executed

How much SQL should your agents write outside governance ? None.

Every cell below is a real run against a shared DuckDB (and Snowflake trial) dataset. The same Jaffle-shop questions run through Semantic Rails, MetricFlow, Cube, Malloy, Snowflake Semantic Views, and KtX. Where a layer can't express the intent as a governed primitive, the question still gets answered - but the cost shows up as a helper view, a precomputed rollup, or query-level SQL.

Coming from MetricFlow? Translate your existing project with one command.

The translator reads your semantic_models/ directory or semantic_manifest.json, and emits a complete package directory you can load, edit, and commit. Imported metrics keep their semantics and are easily upgraded to the more expressive primitives used by Semantic Rails.

uv run semantic-rails import \
    --from metricflow \
    --source path/to/target/semantic_manifest.json \
    --output configs/semantic_rails \
    --package-id my_package

The scoreboard.

Semantic Rails workspace runtime · Apache-2.0
16 native
16 / 16native
MetricFlow dbt-metricflow 0.11.0 · Apache 2.0
9 7 precomputed
9 / 16native
Cube 1.6.32 · Apache 2.0
6 4 6
6 / 16native
Malloy 0.0.52 · MIT
7 9 workaround
7 / 16native
Snowflake Semantic Views trial account · proprietary
7 9 workaround
7 / 16native
KtX ktx-sl 0.13.1 · Apache 2.0
7 9 workaround
7 / 16native
native: governed primitive precomputed: helper view / rollup workaround: SQL outside the governed surface

Where we shine.

Any agentic governance solution should be able to answer the first 7 questions as table-stakes. The other 8 questions are still relatively basic, but demonstrate where the different solution architectures deviate.

q01 – q07 · required

The baseline

Count, sum, group-by-month. Every layer can basically do the basics. Otherwise they wouldn't be in the conversation.

Semantic Rails 7 native
MetricFlow 7 native
Cube 6 native · 1 workaround (q05)
Malloy 7 native
Snowflake SV 7 native
KtX 7 native
q08 – q16 · stretch

The runtime difference

Metric predicates, temporal validity, same-store conversion, contextual entity-graph inheritance. Without these as primitives, your agent leaves the governed API and writes raw SQL against the warehouse.

Semantic Rails 9 native
MetricFlow 2 native · 7 precomputed
Cube 3 workaround · 6 precomputed
Malloy 9 workaround
Snowflake SV 9 workaround
KtX 9 workaround

The benchmark

Sixteen questions that any analyst should be able to answer.

All 16 normalized outputs match across the six layers; configuration parity rules are published in the methodology.

Question Semantic Rails MetricFlow Cube Malloy Snowflake SV KtX

Warehouse coverage.

Your semantic layer needs to work with your data. Since we're open-source, it's easy to add more dialects and more connectors. Don't lock yourself into a proprietary solution.

Backend Semantic Rails OSS adapter dbt Semantic Layer Cloud Cube Malloy Snowflake Semantic Views KtX primary source / ktx-sl
Snowflake native connector native platform native connector native connector warehouse-native native connector
BigQuery native connector native platform native connector native connector no native connector
Databricks native connector native platform native connector native connector no dialect-only
Amazon Redshift no native platform native connector no no no
SQL Server no no native connector bridge no native connector
Microsoft Fabric no no native connector no no no
PostgreSQL native connector native platform native connector native connector no native connector
MySQL no no native connector native connector no native connector
ClickHouse native connector no native connector no no native connector
Amazon Athena native connector no native connector no no no
Trino / Presto no Trino only native connector native connector no no
DuckDB native connector no native connector native connector no dialect-only
MotherDuck native connector no native connector native connector no no
DuckLake native connector no no no no no
SQLite no no native connector no no native connector

Have questions about the benchmark?

Every configuration, query, and normalized output is in the repo. If you find a better configuration for any layer, submit a PR and we will gladly update the benchmark.

Browse the pack on GitHub Methodology rules Question source (YAML)