Synthesis — Analytical Databases
The evolving thesis. Spun out of the hub _inbox analytical-databases cluster on 2026-06-18 at the
human's direction — a deliberate early spin-out at two sources (below the usual ≥3), both
ClickHouse-vs-DuckDB comparisons. So the founding corpus is narrow: one axis (embedded vs distributed
OLAP), seen once through a vendor lens and once through an
independent practitioner lens. The domain is much larger than that, and
the thesis below is a starting frame to test as warehouses, real-time platforms, and more engines arrive.
Current thesis
Analytical (OLAP) databases sit on an embedded↔distributed spectrum, and the right answer is usually a position on it — often more than one position at once.
-
duckdb anchors the embedded / in-process end: a library inside your app, single machine, zero ops. Strong for notebooks, dev, edge, and datasets that fit one box (≈100 GB; ~1B rows on a 16 GB laptop). The "SQLite for analytics."
-
clickhouse anchors the distributed columnar end: shared-nothing MergeTree across nodes, for high-ingest (100K+ rows/s), high-concurrency, RAM-exceeding, fault-tolerant production analytics.
-
tinybird is the managed-service move on top of ClickHouse — abstract shards/replication/ routing and add an API serving layer, trading control for less ops.
-
snowflake opens a second axis the embedded↔distributed line missed: storage-compute-disaggregation. Its SIGMOD 2016 paper argues the shared-nothing design ClickHouse uses (compute tied to local disk) is a poor cloud fit, and splits storage (object store) from compute (elastic "virtual warehouses") into independently scalable services. So the map is now 2-D: where on embedded↔distributed and coupled vs disaggregated. Both clickhouse and snowflake are "distributed," but classic ClickHouse is coupled while Snowflake is disaggregated — that's the sharper distinction than "single box vs many boxes."
-
apache-druid opens a third axis: freshness — how long after an event arrives you can query it. Its SIGMOD 2014 paper answers in hundreds of milliseconds, because events land in an in-memory row index that is queryable before any columnar conversion happens, and only later merge into immutable time-partitioned segments. Both engines above answer this question in batches. What makes it an axis rather than a feature is the price: Druid requires a timestamp on every row (that is what enables first-level query pruning) and shipped without joins, arguing the case rather than treating it as unfinished — "scaling join queries has been… a constant bottleneck of working with distributed databases." So the map is 3-D, and the third dimension is bought with the query surface.
Added 2026-06-30: the warehouse end is now sourced (Snowflake, T1). It reframes the founding "use both" finding: PostHog reached for embedded DuckDB because a coupled engine didn't fit per-tenant warehousing — disaggregation is the other escape hatch from the same coupling problem.
The sharpest finding so far: the "vs" framing is partly false. The independent PostHog account is the load-bearing source — at production scale they run both, for different layers: ClickHouse for their own product event-analytics, and DuckDB (wrapped in Duckgres on DuckLake + a Postgres catalog) for a per-customer data-warehouse product that had to scale independently, because self-managed ClickHouse "would not work for data warehousing for all of our customers." So the practitioner question isn't "which wins" but "which engine for which layer of the stack" — embedded per-tenant warehousing vs centralized high-scale event analytics.
Open questions
- Is "use both" the general pattern or a PostHog-specific architecture? Needs more practitioner accounts before generalizing.
- Where do the cloud warehouses fit? Partly answered (2026-06-30): snowflake is now sourced from its SIGMOD 2016 paper (T1) — they fit via a new storage-compute-disaggregation axis (elastic compute over shared object storage), not just a point on embedded↔distributed. Still open: BigQuery (Dremel/Colossus) and Databricks (lakehouse) are the same disaggregated family but unsourced. Updated 2026-08-15: the real-time family is no longer unsourced — apache-druid is in, and it corrects the description this line carried. The shape is not pre-aggregated serving; Druid stores raw events and answers in milliseconds by partitioning on a mandatory timestamp. Pinot and StarRocks remain unsourced.
- How much of the gap is the engine vs the managed service? tinybird reframes "ClickHouse is hard to operate" as a serving problem; the engine-vs-ops distinction needs its own sources. Widened 2026-08-04 (jitsu). The same question exists at the other end of the pipeline: ingestion latency is set by the loader's batching policy, not the engine, and a fast columnar store behind a twice-daily loader is a slow analytics stack. So the spoke now has the engine flanked by two commercial layers — serving (tinybird) and ingestion (jitsu) — each arguing that the packaging around the engine is the real product. Neither supplies a measurement. That is starting to look like the spoke's actual subject rather than a distraction from it.
- Do the engine distinctions survive contact with the pipe? New 2026-08-04. jitsu treats clickhouse, snowflake, BigQuery, Redshift, Postgres and S3 as interchangeable destinations differing mainly in loading interface. The storage-compute-disaggregation axis says these are architecturally distinct in ways that should matter; at the ingestion layer, apparently they do not. Whether that is a real finding about where the differences live, or just what a pipe vendor needs to be true, is unresolved on one source.
- Does the real-time family's trade still hold? New 2026-08-15. apache-druid bought millisecond freshness by giving up joins and SQL, and argued both were the right price. Druid has since added SQL, clickhouse has moved toward real-time ingestion, and the spoke has no source for either development. Whether freshness still costs the query surface — or whether the two families converged — is unresolved, and the 2014 paper cannot answer it.
- The OLTP boundary. This spoke is analytical/OLAP; where HTAP / Postgres-as-analytics (DuckLake's Postgres catalog hints at it) blurs the line is an open edge.
Growth edges
Ranked; each names the kind of source that would close it (see ../QUALITY.md → Growth edges).
The real-time serving family.Half closed 2026-08-15 (quality cycle) — druid-real-time-analytical-data-store (Yang et al., SIGMOD 2014, T1) supplies the family's architecture: node-type separation, in-memory-then-segment ingestion, timestamp-mandatory partitioning, and the deliberate absence of joins. The shape turned out to be freshness plus concurrency, not pre-aggregation, which is how this edge had described it. Successor: Druid is one design and one company's production cluster from 2014. Pinot and StarRocks remain unsourced, and nothing compares the three or measures them against clickhouse, which is the engine practitioners actually weigh them against. — needs: the Pinot or StarRocks paper, or any benchmark putting a real-time engine beside a general columnar one. Advanced 2026-08-16 (research pass), and the half that closed is not the half that was asked for. pinot-realtime-olap (Im et al., SIGMOD 2018, T1) gives the spoke its second real-time design (apache-pinot) and the family's first head-to-head — Pinot against Druid on nine stated hosts, production data, production queries. So "one design" is answered and "nothing compares them" is half-answered. StarRocks was hunted and refused: it has no paper. Every StarRocks-vs-ClickHouse comparison in reach is published by StarRocks or its commercial arm CelerData (SSB 2.2×, TPC-H 3–5×), and the nearest counterweight is Tinybird's, which sells managed ClickHouse. Both sides sell the winner. Needs now: a real-time engine measured against clickhouse by someone selling neither — an academic benchmark, or an operator publishing a migration with numbers. The direct comparison the edge was written for is still missing, and the market's own literature cannot supply it. Hunted again 2026-08-30 (research pass) — the operator half arrived and the ClickHouse half did not. realtime-data-infrastructure-uber (Fu & Soman, SIGMOD 2021, T1) is exactly the operator publishing at scale the edge names: petabytes and trillions of messages per day, Pinot from dozens of GB to several hundred TB and from a few hundred QPS to tens of thousands in two years, against a p99-under-one-second requirement. It measures Pinot against Elasticsearch (4× the memory, 8× the disk, 2–4× the query latency) and against Druid not at all — ClickHouse appears once, in related work. So the edge stands as written. Successor edge 1a below records what the hunt found instead. Hunted 2026-09-17 — nothing ≥ bar. StarRocks' SSB page (2.2× vs ClickHouse, 8.9× vs Druid) is the vendor's own; ByteHouse (ByteDance, arXiv 2602.08226, 2026) is a real paper but benchmarks against unnamed "existing systems" on internal workloads. No Pinot or StarRocks paper. Not eligible again before 2026-10-01. 1a. The Pinot-over-Druid claim has one pool of sources, and one of them is a blog. Discovered 2026-08-30 while hunting edge 1. Uber, the largest Pinot operator, supports its Druid rejection in a SIGMOD paper by citing "recent studies done outside of Uber" — reference [47] of which is a Medium post. This spoke's own Pinot-over-Druid material (pinot-realtime-olap, realtime-data-infrastructure-uber) therefore traces back to a narrower base than two independent T1 sources suggests. — needs: a Pinot-vs-Druid measurement by a party affiliated with neither, on stated hardware. T1/T2.- The rest of the disaggregated family. Snowflake is sourced from its SIGMOD paper; BigQuery (Dremel/Colossus) and Databricks (lakehouse) are the same family and unsourced. — needs: the Dremel or lakehouse paper (T1).
- Engine versus packaging, measured. tinybird (serving) and jitsu (ingestion) both argue the packaging around the engine is the real product, and neither supplies a number. — needs: any measurement separating engine performance from the managed layer. Sharpened 2026-10-07, promoted from the dream ledger. Tinybird names the serving side as where ClickHouse gets hard to run. But ClickHouse writes each insert as a new immutable part that a background process has to merge later — frequent small inserts build a merge backlog and can trip "too many parts" errors, a write-path cost rather than a serving one. Jitsu's Bulker batches before loading, which looks like the same problem answered from the other end of the pipe. If the write path is where the operational cost concentrates, Tinybird's own framing is naming the wrong half of the gap. — needs now: a load test of an ingestion pipeline into self-hosted ClickHouse at several batch intervals, measuring part count, merge backlog and insert errors against batch size.
Coverage edges (added 2026-08-08, at the curator's request for a wider backlog). These widen what the spoke covers instead of answering an open question above; one ordinary solid source closes any.
The file formats everything rests on.CLOSED 2026-08-09 (research pass) — parquet, orc and apache-arrow from their own specifications, plus columnar-format-evaluation (Zeng et al., VLDB 2023) as the benchmark, all T1. Successor: what replaces them. The paper says the standard formats encode early-2010s assumptions; several projects (BtrBlocks, Lance, Vortex, Nimble) claim to be the answer and the spoke holds none of them. — needs: a next-generation format's design paper, T1/T2. CLOSED 2026-08-22 (research pass) by btrblocks (Kuschewski, Sauerwein, Alhomssi & Leis, SIGMOD 2023, T1). Successor, edge 8: one of the four, from one group, benchmarked by its own authors against their own Parquet harness. Lance, Vortex and Nimble are unsourced and nothing compares any two next-generation formats to each other. — needs: a second format's design paper, or any third-party comparison of them.- Open table formats. Iceberg, Delta Lake and Hudi are where the lakehouse claim is actually made, and storage-compute-disaggregation has no counterpart page for the metadata layer that makes the shared storage writable. — needs: a specification or design paper.
- A query engine that owns no storage. Trino and Presto separate execution from the store, the clean case for the disaggregation axis. — needs: the Presto SIGMOD paper or Trino's own docs.
- What people put in these engines. dbt and dimensional modelling (Kimball) shape more analytical workloads than engine choice does, and the spoke covers only engines. — needs: dbt's documentation or a modelling text.
- The other next-generation formats. (new 2026-08-22, successor to edge 4) btrblocks is one of four candidates columnar-format-evaluation pointed at; Lance, Vortex and Nimble are unsourced, and no comparison of any two of them exists here. The BtrBlocks numbers are also its own authors' against their own Parquet harness, unreplicated. — needs: a second next-generation format's design paper, or a third-party comparison across them.
Two designs in one family, and one of them tuned the other (2026-08-16)
pinot-realtime-olap arrives eleven months of spoke-time after druid-real-time-analytical-data-store and four years after it in publication time, from linkedin rather than Metamarkets, and it makes the real-time family legible in a way one paper could not.
What the two agree on is more than the vocabulary: immutable segments, node-type separation (broker / server / coordinator-controller), streaming ingestion made queryable before columnar conversion, and a hard commitment to concurrency at sub-second latency. That is the family's shape, and it is now attested twice by two teams who did not collaborate.
What they disagree about is where the speed comes from, and the disagreement is measurable. Druid indexes every dimension column; Pinot indexes selectively and sorts rows physically on the identifier queries filter by. On one production dataset that difference shows up as 1.2 TB against 300 GB for the same workload. Pinot's own measurement credits layout — physical ordering — over index structure on its highest-throughput case, and credits its star-tree pre-aggregation on the ad-hoc case. Without any indexes at all, the two engines perform comparably, which is a quiet way of saying the architecture is shared and the tuning is the product.
The methodological point is the one to keep. Druid's paper benchmarked against MySQL/MyISAM, declining to tune a rival column store; Pinot's paper does tune the rival, and the rival is Druid. Neither escapes self-interest, and the corpus now holds both directions of the same bias — the paper that refuses to compare and the paper that compares on its own terms. That is as close to a controlled read as this literature currently offers, and it is still not close.
What is still absent is the comparison practitioners actually make: a real-time engine against clickhouse, measured by someone selling neither. The hunt for StarRocks found no paper at all and a market where every published benchmark belongs to a vendor on one side or the other — StarRocks and CelerData claiming 2.2× on SSB and 3–5× on TPC-H, Tinybird answering while selling managed ClickHouse. A family this commercially contested may simply not produce a neutral number.
A compression ratio is the wrong number for a networked scan (added 2026-08-22)
btrblocks closes the format-successor edge and lands on something this spoke has been quoting carelessly. Compression ratios are how parquet, orc and every vendor page argue, and for a scan pulled across a network they measure the wrong thing.
The correction. Decompression throughput is normally reported against uncompressed size, where every Parquet variant clears 50 GB/s and looks far faster than a 100 Gbit link needs. Against compressed size — the bytes that actually arrive — Parquet+Zstd manages 24.8 Gbit/s. Compressing better makes this worse, because the same CPU time now covers fewer wire bytes. BtrBlocks reaches 86.2 Gbit/s against a client ceiling of 91, and costs 1.8× less per scan while compressing worse than Parquet+Zstd on real data (5.28× vs 6.05×).
That is a genuine trade this spoke had no vocabulary for: storage cost against scan cost, decided by where the data sits relative to the compute. It belongs next to storage-compute-disaggregation — the axis that made the trade exist in the first place.
And it re-reads an old result. columnar-format-evaluation found the open formats encoded early-2010s assumptions. The assumption that turned out to matter most was not an encoding choice at all; it was that decompression is cheap relative to I/O, which stopped being true when the I/O became 100 Gbit.
A caution the page carries and this section should repeat. The authors built both sides of the comparison. Nothing independent has re-run it, which is the same shape as the vendor benchmarks this spoke discounts — except that the seller here is a university group with no product. Grade it T1 and treat the numbers as unreplicated.
Something arrived that is not an engine (2026-08-31)
slayer (MotleyAI, MIT, 158★, routed 2026-08-31) is the first semantic layer in this spoke and the second source, after jitsu, that sits above every engine the wiki is built around. The two bracket the stack from opposite ends: Jitsu writes events into whichever warehouse you name, SLayer reads out of whichever warehouse is behind it. Neither stores anything. Both treat duckdb, clickhouse, snowflake and their peers as a configuration value.
That is worth recording because the spoke's founding thesis — "not which engine wins, but which engine for which layer of the stack" — assumes the engine choice is the interesting decision. Two sources now model it as substitutable. They do not refute the thesis (both are early, both are one project's design, and neither argues the engine is irrelevant), but they describe a stack in which the engine is the part you swap and the layer around it is the part you keep. Two sources is a thing to watch, not a finding.
The argument SLayer actually makes is narrower and more testable than that. Classical semantic
layers bind a metric to its aggregation at definition time — monthly revenue is a defined object.
A dashboard user picks from what was defined, so the boundary is invisible. An agent answering an open
question crosses it on the first ratio or year-over-year comparison. SLayer's answer moves aggregation
to query time (revenue:sum, revenue:avg, revenue:sum / *:count,
time_shift(revenue:sum, -1, 'year')) while keeping definitions and row-level security at design time.
And what that trades should be stated, because the source does not. A predefined metric is a guarantee that everyone gets the same number. An expression grammar hands composition back to the caller, and the motivating caller is a language model. The model is still constrained — governed columns, fixed grammar, no free SQL — but consistency stops being structural. Whether that is a good trade is exactly the kind of question this spoke likes and nobody has measured it.
The evidence base is one screenshot. SLayer publishes no benchmark: no accuracy comparison against letting a model write SQL, no translation overhead, no third-party review. The README shows LLM-written SQL beside the equivalent SLayer query for one question on a demo dataset. That is an illustration. Against a spoke whose strongest pages are SIGMOD and VLDB papers with production numbers, this is the thinnest corner in the wiki, and it is thin on a question — should an agent write SQL or call a governed layer? — that is about to matter commercially. New growth edge: any measurement at all on agent-facing analytics interfaces.
One more thing the metadata says. 2,035 commits against 158 stars, sustained over five months. The hub keeps meeting the opposite shape — thousands of stars behind a single push — and it is worth noting that neither number is evidence about the software. Attention and maintenance are separate axes, and this artifact has the second without the first.
Contradictions / tensions
- Portability freezes the format (2026-08-09). storage-compute-disaggregation works because any engine can read the same open files, and columnar-format-evaluation shows the cost of that guarantee: parquet and orc carry design decisions from the early-2010s Hadoop world — compression ratio favoured over decoding speed, dictionary encoding optional, coarse skip structures — and the paper measures them failing on ML workloads and GPU decoding, neither of which existed when the formats were designed. An engine can rewrite its execution layer whenever it likes; it cannot change the format without leaving the ecosystem that made shared storage valuable. So the same property this spoke credits for the lakehouse is the property preventing the substrate from improving. Not a contradiction between two sources — both agree on the facts — but a real tension inside the spoke's own thesis. No direct fact conflict between the two founding sources — but a framing tension worth flagging: the vendor T3 frames ClickHouse as the production answer (and Tinybird as the way to run it), while the independent T2 shows a real shop reaching for DuckDB precisely because ClickHouse didn't fit a major workload. Weight the independent account more; the vendor numbers are indicative, not neutral.
Cross-spoke adjacency
../cloud-wiki— where you rent the machines/managed services these run on (pricing/IaaS); this spoke is the database as subject.../platform-ops-wiki— the SRE/observability practice of operating prod stores (ClickHouse cluster ops, ZooKeeper/replica management); here it's the engine, there it's running it.../dev-tooling-wiki— serialization/wire formats (Protobuf/yaff) move data between systems; an OLAP database stores and queries it — adjacent data layers, different jobs.
Index — Analytical Databases Wiki
Catalog of every page, grouped by schema.org
@type. Spine: synthesis (thesis),log.md(history), this file (catalog). Benchmark/version facts are dated snapshots.
DefinedTerm (concepts)
-
analytical-databases — umbrella: OLAP/columnar query engines across the embedded↔distributed spectrum; the axes this spoke tracks · domain
-
storage-compute-disaggregation — the coupled-vs-disaggregated axis (shared-nothing vs object-store + elastic compute); orthogonal to embedded↔distributed
-
semantic-layer — the read-side layer above the engine: business meaning (metric definitions, row-level security) defined once and compiled to SQL. Entered 2026-08-31; the open argument is whether agents make the BI-era design obsolete, and this wiki holds no evidence either way · concept
-
parquet — the on-disk columnar format: row groups → column chunks → pages, footer-last so a file can be written in one pass, metadata deliberately separable from data. The substrate the lakehouse claim assumes ·
source· T1 · parquet.apache.org -
orc — Hive's type-aware columnar format: ~200 MB stripes that never split a row, min/max statistics every 10,000 rows plus bloom filters, an uncompressed ≤256-byte postscript to bootstrap the reader. Near-twin of Parquet in structure, different lineage ·
source· T1 · orc.apache.org -
apache-arrow — the in-memory columnar format: validity bitmap + buffers, aligned for SIMD, "relocatable without pointer swizzling" so sharing is zero-copy across processes and languages. Buys read performance at the cost of expensive mutation ·
source· T1 · arrow.apache.org
SoftwareApplication (databases / platforms)
- duckdb — embedded, in-process analytical (OLAP) database; single-machine, zero-ops; the "SQLite for analytics"
- clickhouse — distributed columnar OLAP database (MergeTree); horizontal scale for high-ingest, high-concurrency analytics
- snowflake — cloud data warehouse; storage-compute disaggregated, elastic "virtual warehouses," pay-per-use SaaS
- tinybird — managed ClickHouse + an API serving layer (hides shards/replication/routing) for real-time analytics
- apache-pinot — LinkedIn's real-time OLAP datastore: segments + brokers/servers/controllers, Kafka realtime table over a Hadoop offline table, and three levers ranked by its own measurements — star-tree pre-aggregation, physical row ordering, partition-aware routing · engine
- apache-druid — distributed column store for real-time serving: events queryable within hundreds of ms of arrival, ~550 ms average query latency under hundreds of concurrent users. Mandatory timestamp column, no joins — the freshness axis, bought with the query surface
SoftwareSourceCode (sources)
- slayer — MotleyAI, MIT, 158★ but 2,035 commits: an embeddable semantic-layer for agents — define a column once, compose the aggregation at query time (
revenue:sum,time_shift(revenue:sum, -1, 'year')), reached over MCP / REST / CLI / Python / Flight SQL / a Postgres facade, importing dbt, Cube and OSI configs. Read-only with row-level security, so also a blast-radius control on an agent with database access. No benchmark; one illustrative screenshot against LLM-written SQL ·source· T1 · github.com/MotleyAI - jitsu — jitsucom, MIT, 4.9k★: open-source event data platform ("Segment alternative") — Ingest/Rotor/Bulker/Sync-controller/Console over Kafka + ClickHouse; lands events in ClickHouse, BigQuery, Snowflake, Redshift, Postgres, S3. The spoke's first source on the layer above the engine; treats the warehouses as interchangeable endpoints ·
source· T1 · github.com
Organization (entities)
- linkedin — built apache-pinot for its own member-facing analytics; an operator, not a vendor, which is what makes its production figures a different kind of evidence · operator
- snowflake-computing — the company behind snowflake (founded 2012; AWS GA June 2015)
- motleyai — publishes slayer; maintains it actively (2,035 commits in five months) with docs, PyPI and a Discord. Commercial model not stated anywhere read · thin node
ScholarlyArticle / TechArticle / BlogPosting (sources)
- realtime-data-infrastructure-uber — Fu & Soman, SIGMOD 2021 (T1): Uber's real-time stack as operated — trillions of messages and petabytes a day, Pinot from dozens of GB to several hundred TB and a few hundred to tens of thousands QPS in two years, under a p99-under-1s requirement. Measures Pinot against Elasticsearch (4× memory, 8× disk, 2–4× latency) and against Druid not at all — citing a Medium post for that choice ·
source· T1 · arxiv.org - btrblocks — Kuschewski, Sauerwein, Alhomssi & Leis (TUM/FAU), BtrBlocks: Efficient Columnar Compression for Data Lakes, SIGMOD 2023; the next-generation format columnar-format-evaluation asked for. Seven encodings plus a new Pseudodecimal double scheme, cascaded, with the scheme chosen by sampling rather than by rule, and metadata deliberately kept out of the file. The finding worth carrying: a compression ratio is the wrong number for a networked scan — against compressed bytes Parquet+Zstd decompresses at 24.8 Gbit/s where BtrBlocks reaches 86.2, so BtrBlocks compresses worse on real data (5.28× vs 6.05×) and still scans S3 1.8× cheaper. Authors built both sides; unreplicated · T1 · cs.cit.tum.de
- columnar-format-evaluation — Zeng, Hui, Shen, Pavlo, McKinney & Zhang, VLDB 2023 (T1): Parquet vs ORC stress-tested — both "developed over a decade ago, in the early 2010s, for the Hadoop ecosystem." Recommends dictionary encoding by default, decoding speed over compression ratio, optional block compression, finer-grained skip structures; finds them inefficient for ML workloads and GPU decoding ·
source· T1 · arxiv.org - pinot-realtime-olap — Im et al. (11 LinkedIn authors), SIGMOD 2018: 3,000+ hosts, 1,500+ tables, >50,000 QPS, and the family's first head-to-head — Pinot vs Druid on nine stated hosts with production data. Druid ≈ Pinot-without-indexes; Druid's index-everything default costs 1.2 TB against 300 GB. Benchmarked by Pinot's own team ·
source· T1 · dl.acm.org - druid-real-time-analytical-data-store — Yang, Tschetter, Léauté, Ray, Merlino & Ganguli (Metamarkets), SIGMOD 2014 (T1): the real-time analytical store — four independent node types, in-memory index → immutable segments → deep storage, 5–10M-row time-partitioned segments, dictionary encoding + inverted index. Joins deliberately absent, defended in the paper. Production: ~550 ms mean latency, 99% under 10 s, ~50B rows against 10.5 TB RAM; 500 MB/s ingest. TPC-H comparison is against MySQL only, which the authors explain and which limits it ·
source· T1 · github.com/apache/druid - snowflake-elastic-data-warehouse — Snowflake's SIGMOD 2016 paper: the multi-cluster shared-data architecture; storage/compute separation ·
source· T1 · cs.cmu.edu (mirror) - posthog-duckdb-vs-clickhouse — PostHog eng blog: "why we use both" — ClickHouse for product analytics, DuckDB for the customer warehouse ·
source· T2 · posthog.com - tinybird-clickhouse-vs-duckdb — Tinybird: ClickHouse vs DuckDB node-scaling comparison (vendor) ·
source· T3 · tinybird.co
Synthesis
- synthesis — the evolving thesis (open questions + flagged contradictions)