Time Series Databases

Five contenders, one workload class, very different bets on storage, cardinality, and what "production" means.

Category Sweep · PE / L7 Depth

As of 2026-06-04 · InfluxDB 3.8 · TimescaleDB 2.26+ · Prometheus 3.x · VictoriaMetrics v1.x · ClickHouse 25.x

PE Verdict

The category has split. Prometheus and VictoriaMetrics are operational metrics engines built around a pull model and label cardinality budget. ClickHouse and InfluxDB 3 are columnar OLAP engines retrofitted for time series, with effectively unbounded cardinality but real operational complexity. TimescaleDB bridges them by paying a row-store tax in exchange for full SQL and Postgres ecosystem. For commodity service monitoring, default to VictoriaMetrics. For observability at scale across metrics, logs, and traces, ClickHouse has won the market. InfluxDB only on greenfield where the FDAP ecosystem matters — the 1→2→3 architecture pivots have cost users a five-year migration tax.

Best default choices

1. Trade-Offs

Each table is one technology, one row per distinct trade-off. Click any column header to sort.

InfluxDB 3

Use when object storage economics, Parquet/Arrow interoperability, and SQL over time-series data matter more than raw ingest speed or mature HA in Core.

FDAP / Rust / Parquet on S3
Trade-OffWhat You GainWhat You Give UpWhen It Bites YouPE Nuance
Object storage as primary persistenceStorage cost drops to S3 economics, ~$23/TB/month vs ~$80 for EBS gp3Cold-tier query latency jumps from sub-second to seconds; predicate pushdown only helps for filtered scansDashboards that scan 30+ days of historical data with wide GROUP BYThe diskless story sells the architecture but the hot tier is still in-memory Arrow; cache misses are brutal
Complete rewrite from Go to Rust on FDAP stackUnlimited cardinality (the v1/v2 ceiling at ~10M series is gone)v3 Core is a different product; v1/v2 migration is rewrite-grade, not upgrade-gradeExisting InfluxQL/Flux pipelines, TSM-specific tooling, Telegraf plugins assuming v2 semanticsInfluxData has burned the boats three times. Customers learned. New adoption has slowed visibly
Parquet on disk, Arrow in memoryInterop with Pandas, DuckDB, Spark, Snowflake for free; no export ETLIngest throughput trails purpose-built engines; ~320K rows/sec vs QuestDB's 11M rows/sec on the same hardwareHigh-frequency telemetry, financial tick data, sub-second sensor arraysThe architectural bet is on long-term ecosystem leverage, not raw ingest. Reasonable bet, but it's a bet
SQL as primary query languageDataFusion handles standard SQL, joins, window functions; analysts don't need FluxFlux ecosystem (tasks, transforms) is not fully replaced; InfluxQL is compatibility-onlyTeams that built on Flux scripting for downsampling and alertsThe Flux walk-back is the most painful UX regression. Users who invested are stranded
Tag/field model carried over from v1/v2Line Protocol still works; existing Telegraf collectors require minimal changesThe data model is still string-tag-heavy; schema design still matters for performanceSchemas with high-cardinality tags treated as free dimensions, then queried with wide aggregationsUnlimited cardinality at the engine doesn't mean unlimited cardinality is wise. Tag hygiene still matters
Open-core licensing split between Core and EnterpriseCore is free and Apache 2.0; covers single-node and basic multi-nodeReplication, clustering, RBAC, and durability features are Enterprise-onlyProduction deployments needing HA without paying for Enterprise or TimestreamThe "free for single-node" model has historically driven users to alternatives once they hit scale
Embedded Python runtime for transformsZero-copy from Arrow to Python via PyArrow; transforms run in-processPython in the hot path is a new failure mode; UDF crashes block ingestHeavy compute UDFs run inline rather than via downstream Kafka consumersThis is genuinely novel but operationally risky. Bound resource limits hard
Compaction to Parquet runs backgroundRecent data immediately queryable from WAL + in-memory ArrowBackground compactor can fall behind under sustained ingest, growing WAL on disk and query latencySustained ingest at 100% of node capacity for multiple hoursWatch the compaction queue depth metric like a hawk. Falling behind is a slow-motion outage

TimescaleDB (Tiger Data)

Best when the workload benefits from Postgres semantics, joins, extensions, and operational familiarity while accepting single-node or cloud-managed scale limits.

Postgres extension / Hypertables
Trade-OffWhat You GainWhat You Give UpWhen It Bites YouPE Nuance
Postgres extension instead of standaloneFull SQL, joins, foreign keys, transactions, pgvector, every Postgres tool just worksYou inherit Postgres's WAL, autovacuum, single-writer-per-row limits, and connection pool fragility10K+ concurrent writers; autovacuum storms during compression cyclesThe Postgres dependency is the entire value prop and the entire ceiling. Both at once
Hybrid row/column storage (Hypercore)Recent data in rowstore for low-latency reads; old data in columnstore for 90%+ compressionConversion is policy-driven background work; can lag, leaving rowstore chunks consuming 7x more disk than expectedCompression policies failing silently while disk fills (known bug 8771 affects 2.22.1)Hypercore TAM was deprecated in 2.21 for sparse indexes. The story keeps changing, watch release notes
Compressed chunks are functionally immutablePredictable compression ratios; LZ4/gorilla/delta-of-delta encoding by typeDML on compressed data triggers decompress-modify-recompress cycles per affected segmentBackfills, late-arriving data, frequent corrections on historical metricsIf you correct historical data routinely, set compress_after to multiples of your correction window
Automatic time-based chunkingChunk pruning makes time-range queries O(chunks-in-range), not O(table-size)Chunk interval is chosen at hypertable creation; resizing live tables requires migrationWrong chunk_interval (too small: index bloat; too large: poor pruning) discovered at 6 months of dataDefault is 7 days. For typical IoT, 1 day. For high-cardinality observability, 1-6 hours. Get this right at design time
Continuous aggregates as materialized viewsPre-rolled hourly/daily aggregates; concurrent refresh in 2.26+ with sparse index backingRefresh policies consume CPU; if you have 50 continuous aggregates, refresh windows overlapContinuous aggregate refresh jobs starve normal ingest CPU during business hoursStagger refresh schedules. Cap parallel jobs. This is the most common ops surprise in TimescaleDB
SQL is the only query interfaceNo PromQL/Flux to learn; existing BI tools (Tableau, Metabase, Looker) work nativelyNo native pull-based scrape model; you need Prometheus Adapter or similar for /metrics endpointsKubernetes observability shops expecting Prometheus-style scrapeThis is why TimescaleDB rarely replaces Prometheus; it replaces InfluxDB or sits next to Prometheus via remote_write
Direct Compress ingest (tech preview)37x ingestion speedup by compressing in memory before WAL writeRequires pre-sorted COPY input; incorrect sort silently corrupts dataPipelines that can't guarantee sort order at ingest timeRead the warning. Wrong sort key gives wrong query results without erroring. Not safe yet for arbitrary workloads
Vertical scaling primary, horizontal limitedA single 64-core, 256GB node handles 1M+ rows/sec with proper schemaMulti-node TimescaleDB was deprecated; horizontal scale is now read replicas + sharding-by-app-logicWorkloads beyond a single beefy node, or HA across regionsThe honest answer is "Tiger Cloud or shard yourself." Multi-node distributed hypertables are gone as of 2.14

Prometheus

Choose for service monitoring, scrape-based collection, PromQL alerting, and the exporter ecosystem when single-node retention and HA trade-offs are acceptable.

Pull-based / Single-node / Local TSDB
Trade-OffWhat You GainWhat You Give UpWhen It Bites YouPE Nuance
Pull-based scrape modelTargets self-describe via /metrics; service discovery via Kubernetes API or Consul is trivialCannot ingest short-lived jobs reliably; needs Pushgateway as a workaroundBatch jobs, serverless functions, anything that exits before the next scrape intervalPushgateway is universally hated but universally deployed. The pull model's one real weakness
In-memory head block + WAL + 2h compactionNewest 2h of data lives in RAM; queries on recent data are sub-millisecondRAM is the cardinality budget; ~5GB RAM per 100K samples/sec ingest rateCardinality explosion from unbounded labels (user_id, trace_id) OOMs the processHealthy instance: 100K-2M active series. North of 5M is a cardinality bomb. North of 10M is on fire
Single-node by designZero distributed-system complexity; one process, one disk, one runbookNo replication, no HA, NFS unsupported, drive loss equals data loss for that retention windowAnything requiring durability or HA without Thanos/Cortex/Mimir bolted onThe architecture choice is honest: "we are a single-node store; if you need more, here are the federation patterns"
PromQL as the query languageRange vectors, rate/irate, histogram_quantile are purpose-built for monitoringNot SQL; analysts and BI tools need an adapter; joins across metrics are awkwardCross-cutting analytical queries; reporting that needs JOIN semanticsPromQL is excellent at what it's designed for and bad at everything else. Don't try to make it a data warehouse query language
Compaction at fixed intervals [2h, 6h, 18h, 54h, 162h, 486h]Predictable I/O pattern; compactions don't run mid-queryCompaction spikes (10s of seconds to minutes at high cardinality) starve scrape loopCardinality > 5M during compaction window causes scrape timeouts and gapscompaction_duration_seconds > 30s is the canonical warning sign. Alert on it
15-day default retentionDisk usage stays bounded; storage planning is straightforwardLong-term storage requires remote_write to Thanos, Cortex, Mimir, or VictoriaMetricsCapacity planning, year-over-year comparisons, compliance retention requirementsPrometheus is a 2-week buffer, not a data warehouse. Treat it accordingly
Block deletion is whole-blockNo per-series GC; retention is trivial cleanupCannot delete individual high-cardinality metrics without rewriting blocks; tombstones are partial"Drop this one rogue label that's polluting our TSDB" — there's no clean wayThe cleanest fix is metric_relabel_configs at scrape time. Server-side deletion is for emergencies
Local-disk only, no S3No network in the storage path; reads stay local and fastNo object storage offload; cold data is as expensive as hot data per GBLong retention on Prometheus-only deployments; >50GB local disk pressureThis is the single biggest reason teams add Thanos sidecar. Worth knowing before you scale

VictoriaMetrics

Best when Prometheus compatibility, high-cardinality tolerance, and simple shared-nothing scaling matter more than consensus-driven replication semantics.

Prometheus-compatible / Shared-nothing cluster
Trade-OffWhat You GainWhat You Give UpWhen It Bites YouPE Nuance
Three-component cluster (vminsert, vmselect, vmstorage)Each layer scales independently; stateless front-ends, stateful storageThree deployments to operate instead of one; observability stack now has its own observability problemSmall teams running single-node Prometheus and adopting the cluster too earlySingle-node VictoriaMetrics handles ~1M samples/sec on a beefy box. Don't reach for cluster prematurely
Consistent hashing on metric+labels for shardingDeterministic placement; vmselect knows which vmstorage holds which seriesNo automatic resharding when adding nodes; new nodes only receive new seriesCapacity expansion in growing clusters; manual rebalance via vmctl is required for even distributionThis is the deliberate KISS choice. Knowing it up front prevents nasty surprises at month 6
Inverted-index design for high cardinalityHandles 10M+ active series comfortably where Prometheus dies at 5MIndex size grows with unique label combinations; 10x more efficient but not infiniteTruly unbounded labels (request_id as a metric label) still kill it eventuallyVictoriaMetrics raises the cardinality ceiling by 10x. It does not remove the ceiling
PromQL + MetricsQL extensionsDrop-in Prometheus compatibility plus useful extensions like rollup_rate and quantiles_over_timeMetricsQL queries don't run on Prometheus; lock-in if you adopt the extensionsMigrations between VictoriaMetrics and Prometheus, federated query setupsUse extensions sparingly. Treat MetricsQL features as Vendor-only sugar, not standard
Replication via -replicationFactor flagEach sample written to N consecutive storage nodes; vmselect tolerates N-1 downReplication is at application layer, not storage; linearly increases resource needs across componentsMulti-AZ deployments where you want 3x replication and underestimated the resource multiplierRF=2 doubles your storage and CPU. RF=3 triples it. Plan capacity accordingly
No gossip, no Paxos, no consensus protocolNo split-brain; no leader election; operators can reason about the system end-to-endNo automated failover semantics; failure handling is "retry the other node"Cross-region coordination, ordered writes, anything requiring distributed consensusThe KISS architecture is the actual product. Compare to Cortex/Mimir's gossip-based complexity
Storage replication offloaded to underlying diskUse GCE persistent disks or EBS replication; no app-level replication overheadApp-level replication is opt-in; default is RF=1 and you can lose data on disk failureCost-optimized single-AZ deployments where someone assumed replication was defaultDefault RF=1 is a documentation-only feature. Verify your replicationFactor flag in prod
Single-binary single-node mode also availableSame engine as cluster; can scale up before scaling outNo HA in single-node mode; one process is one point of failureProduction deployments where ops assumed cluster would magically appearMost teams stay on single-node much longer than they expect. That's by design and it's correct

ClickHouse

Use when the time-series workload is really high-volume analytical data and schema design can be tuned around MergeTree, ORDER BY, and materialized views.

Columnar OLAP / MergeTree
Trade-OffWhat You GainWhat You Give UpWhen It Bites YouPE Nuance
General-purpose columnar OLAP, not TSDB-specificSame engine handles metrics, logs, traces, events, business analytics; one stack for allNot opinionated about time-series; schema design and ORDER BY choice are your problemTeams expecting it to work out of the box without thinking about partitioning, ordering, and TTLThis is why ClickHouse needs a wrapper like ClickStack/SigNoz/Uptrace for observability; the raw engine is too general
MergeTree with sparse primary indexIndex granularity 8192 keeps memory tiny; index for 1B rows fits in MBPoint lookups are O(granule), not O(1); single-row reads cost 8K-row scan minimumWorkloads expecting OLTP-style point lookup latencyWrong tool for transactional reads. Right tool for aggregations over millions of rows
ORDER BY clause permanently determines layoutOptimal ORDER BY (e.g., metric_name, service, time) makes prefix-filter queries scan minimal dataWrong ORDER BY can make queries 100x slower; schema changes require rewriting tablesDiscovering at month 12 that your dashboards filter by service first, but you ordered by host firstThis is the highest-leverage schema decision in ClickHouse. Treat it with the seriousness of choosing a partition key in DynamoDB
Materialized views for pre-aggregationAggregatingMergeTree maintains rolling counts/sums/quantiles; dashboards query aggregated viewsEach materialized view is a write amplification multiplier; 10 MVs equals 11x write costAdding new MVs on hot tables in production; the write fanout surprises teamsPlan MVs at schema design. Adding them later means backfilling, which is expensive
LowCardinality(String) and Map typesDictionary encoding for low-cardinality columns; flexible labels via Map(String,String)Mixing LowCardinality with high-cardinality data degrades to dictionary thrashingUsing LowCardinality on columns with >10K distinct values; performance silently regressesLowCardinality threshold is ~10K. Above that, plain String is faster
Distributed table = view over sharded replicasSELECT pushes down to shards; results merged at coordinatorNo automatic sharding on ingest; you choose sharding key at table creationDefault round-robin sharding hurts when queries filter by service_id but data isn't co-locatedSharding key = your most common filter dimension. Get it right or accept fanout queries
ReplicatedMergeTree via ZooKeeper / ClickHouse KeeperMulti-master replication; any replica accepts writes; eventual consistencyZooKeeper / Keeper is a hard dependency; quorum loss blocks writesKeeper performance issues during high merge activity; the cluster's bottleneck moves to KeeperMove to ClickHouse Keeper if still on ZK. The Keeper transition has been stable since 2024
S3-backed disk for cold storageTiered storage moves cold parts to S3; storage cost drops dramaticallyS3-tier queries are 10x slower than local; predicate pushdown helps but isn't magicDashboards scanning 90-day windows where most data lives in S3 tierTier boundary matters more than raw storage cost. Most teams set 7-30 day hot tier and live with cold latency

2. Use Cases

Production-grade scenarios with named operators, the driving property, and why the alternative fails.

InfluxDB 3

Use when object storage economics, Parquet/Arrow interoperability, and SQL over time-series data matter more than raw ingest speed or mature HA in Core.

Use CaseCompany / ScenarioDriving PropertyScale DimensionWhy Not Alternative
IoT sensor telemetry with high-cardinality device IDsIndustrial IoT platforms migrating from InfluxDB 1.xUnlimited cardinality without v1's series cardinality OOM10M+ devices, 1Hz sensor readings, multi-year retentionInfluxDB 1/2 hit the cardinality wall; Prometheus pull model doesn't fit device push
Time-series analytics with Parquet interopData science teams running pandas/DuckDB downstreamZero-copy export to Arrow; direct Parquet queries from notebooks10-100GB time-series datasets queried from multiple enginesNative TSDB formats require ETL to Parquet; ClickHouse needs export
Managed time-series on AWS via Timestream for InfluxDB 3AWS shops standardizing on managed services (since Oct 2025)Managed Parquet-on-S3 with InfluxDB API compatibilityMulti-TB workloads with elastic compute and decoupled storageSelf-managed VictoriaMetrics is more work; Timestream original (LSM) has different semantics
Real-time analytics with embedded Python transformsTrading and quant teams transforming tick data inlineZero-copy Arrow→Python UDF without process boundary1K-100K ticks/sec with custom indicator computationExternal stream processors (Flink, Spark) add latency; in-DB UDF is novel here
Greenfield SQL-native time-series workloadsNew observability platforms choosing SQL over PromQLDataFusion's standard SQL with time-series-aware optimizationsModerate scale (sub-billion-row tables) with SQL-skilled teamInfluxQL/Flux were proprietary; SQL avoids re-skilling cost
Hybrid hot/cold tiered storage on object storeCost-sensitive multi-year retention scenariosHot data in memory, cold in S3-class object storage10TB+ data with 95% queried within 30 daysPrometheus has no cold tier; TimescaleDB tiering requires Tiger Cloud or app-level work

TimescaleDB (Tiger Data)

Best when the workload benefits from Postgres semantics, joins, extensions, and operational familiarity while accepting single-node or cloud-managed scale limits.

Use CaseCompany / ScenarioDriving PropertyScale DimensionWhy Not Alternative
Financial market data with JOINs to reference tablesTrading firms storing tick data alongside instrument/account tablesSQL joins between time-series and relational data without external systemsMillions of ticks/sec; reference tables in same DB; ACID across themInfluxDB has no real JOIN; ClickHouse joins are awkward; Prometheus can't store reference data
SaaS product analytics dashboardsB2B SaaS exposing usage analytics to customersMulti-tenant Postgres with RLS and continuous aggregates1K-10K tenants, 100M-1B events/day, sub-second dashboard queriesClickHouse RLS is weak; Prometheus is not multi-tenant; InfluxDB tenancy model is awkward
IoT analytics with geospatial queriesFleet management, asset tracking, smart agriculturePostGIS + TimescaleDB in one database; joins between location and metrics10K-1M devices with lat/lon + sensor data; spatial-temporal queriesNo other TSDB has first-class geospatial; InfluxDB's geo support is minimal
DeFi/blockchain analytics (e.g., Solana DEX swap streams)Crypto exchanges and DEX analytics platforms (per Tiger case study)1M+ tx/sec ingestion with Direct Compress; SkipScan for distinct queriesReal-time swap ingestion; FIFO P/L calculations; multi-timeframe aggregatesClickHouse lacks ACID for ledger; InfluxDB lacks JOIN for instrument linkage
Application metrics from Postgres-shop monitoringTeams already on RDS Postgres adding time-series workloadsAdd timescaledb extension; no new ops surfaceSub-1M series; one DB cluster instead of twoPrometheus would require new ops surface and lacks SQL
Energy and utilities meter dataSmart meter pipelines (15-min interval reads, regulatory retention)97% compression with delta-of-delta + ACID retention guarantees1M+ meters, 15-min reads, 7-year regulatory retentionPrometheus has 15-day retention; InfluxDB 1/2 hit cardinality ceiling at meter scale

Prometheus

Choose for service monitoring, scrape-based collection, PromQL alerting, and the exporter ecosystem when single-node retention and HA trade-offs are acceptable.

Use CaseCompany / ScenarioDriving PropertyScale DimensionWhy Not Alternative
Kubernetes infrastructure monitoringDefault for every K8s cluster on the planetNative service discovery via K8s API; /metrics endpoint convention10K-100K pods per cluster; 15s scrape intervalNothing else has the same K8s ecosystem gravity; Prometheus Operator is the standard
SRE alerting and SLO trackingEvery SRE team running Alertmanager + recording rulesPromQL for SLO math; histogram_quantile for latency percentiles~1M-2M active series per Prometheus, alerts in single-digit-second eval timesSQL-based alternatives lack range vector semantics; ClickHouse-based stacks need extra layers
Application-level metrics via client librariesEvery microservices stack with prometheus_client instrumentationCounter/Gauge/Histogram/Summary primitives with strong typingThousands of services exposing /metrics; instrumentation is conventionThe instrumentation ecosystem is unmatched; OpenTelemetry caught up but adoption still trails
Edge/embedded device monitoringResource-constrained edge nodes with local Prometheus and remote_writeSingle binary, small footprint, no dependenciesSingle-digit-MB metrics; remote_write upstream to central long-term storeVictoriaMetrics is comparable; ClickHouse/InfluxDB 3 are too heavyweight for edge
Network and infrastructure exporters (node, blackbox, snmp)Hardware monitoring via the exporter ecosystem250+ official and community exporters covering every hardware/protocol1K-10K targets per Prometheus; pull cadence at 30s-1mThe exporter ecosystem is the moat; no other TSDB has equivalent coverage
Short-term operational metrics (under 2 weeks)On-call dashboards and incident triageSub-millisecond queries on the in-memory head blockReal-time troubleshooting at 15s resolution for current sprintCold-tier stores (Mimir, Thanos, VM cluster) have longer query latency for fresh data

VictoriaMetrics

Best when Prometheus compatibility, high-cardinality tolerance, and simple shared-nothing scaling matter more than consensus-driven replication semantics.

Use CaseCompany / ScenarioDriving PropertyScale DimensionWhy Not Alternative
Long-term Prometheus storageTeams with Prometheus + remote_write to VM for 1-5 year retention10x compression vs Prometheus local blocks; Prometheus-compatible query API10M+ active series, multi-year retention, sub-second query responseThanos/Cortex/Mimir add gossip and consensus complexity; VM avoids both
Multi-tenant metrics platformSaaS observability vendors and internal platform teamsNative accountID/projectID tenancy in cluster URLs1K-10K tenants on shared cluster; tenant isolation at API levelPrometheus has no tenancy; Cortex requires gateway + ACLs; VM has it built in
High-cardinality service metrics (per-customer, per-endpoint)Platforms with intrinsically high-cardinality dimensionsInverted-index handles 10M+ series where Prometheus OOMs at 5M10M+ active series per node; per-customer SLO trackingPrometheus dies; ClickHouse needs full schema redesign; InfluxDB 3 is more ops-heavy
Edge-to-central metrics aggregationMulti-region or multi-cluster setups federating to a single global viewvmagent at edge, cluster at center; cluster-to-cluster vminsert chaining50-500 remote Prometheus instances writing to a global VM clusterThanos Receiver is comparable but more complex; Mimir gossip protocol is fragile at this scale
Cost-optimized observability replacementTeams replacing commercial Datadog/New Relic to cut spendSelf-hosted at 10-50x cheaper than commercial per metric10K-1M time series; cost-per-GB-stored down from $0.50 to $0.05Datadog/New Relic licensing economics force the eject; VM is the most operational drop-in
Single-node high-volume metricsTeams that prefer vertical scaling and operational simplicitySingle binary handles 1M+ samples/sec on a beefy boxUp to single-node hardware ceiling, then go clusterPrometheus single-node ceiling is much lower; cluster setup is heavier

ClickHouse

Use when the time-series workload is really high-volume analytical data and schema design can be tuned around MergeTree, ORDER BY, and materialized views.

Use CaseCompany / ScenarioDriving PropertyScale DimensionWhy Not Alternative
Web-scale observability (logs+metrics+traces)Cloudflare, Uber, Shopify, GitLab, OpenAI run bespoke ClickHouse-backed platformsOne engine handles logs, metrics, and traces with 90% storage reduction vs JVM-based storesBillions of events/day; petabyte-scale retention; sub-second dashboard queriesPurpose-built TSDBs can't handle logs; commercial vendors cost 100x more at this scale
Real-time analytics with materialized view rollupsSigNoz, HyperDX, ClickStack, Uptrace as commercial offeringsAggregatingMergeTree pre-aggregates metrics at write time; dashboards query rollups1M+ events/sec ingest; queries on rolled-up data in tens of msPrometheus can't ingest events; TimescaleDB continuous aggregates have more refresh lag
Security analytics and SIEMCloudflare's network analytics, security event processingFast scan over high-cardinality event data with arbitrary filteringTrillions of events queried with millisecond-to-second latencyElasticsearch is more expensive; Splunk economics are punishing; Prometheus is wrong tool entirely
Financial analytics and tick storageDeutsche Bank, Bloomberg-style analytics on market dataVectorized query engine on columnar data; window functions for time-series mathTrillions of trades; aggregations over years of historyInfluxDB lacks SQL window functions; Prometheus doesn't fit the data model
OpenTelemetry storage at scaleOTel-native platforms (ClickStack with HyperDX UI)Native OTLP ingest path; trace_id-correlated logs/metrics/spans queryable in SQL10K-1M spans/sec; 30-90 day retention with S3 cold tierJaeger/Tempo are trace-only; Loki is logs-only; ClickHouse unifies them
Product analytics and user behaviorYandex.Metrica origins, now widely used for clickstreamFunnel analysis, cohort retention, session reconstruction in SQLTrillions of events; sub-second analytical queries over high-cardinality user dimensionsAmplitude/Mixpanel costs scale linearly; ClickHouse is fixed-cost; Snowflake is more expensive per query

3. Limitations

Rows are limitation categories; columns are technologies. Click the chips above the table to filter.

Limitation InfluxDB 3 TimescaleDB Prometheus VictoriaMetrics ClickHouse
Cardinality ceiling Medium Unbounded by architecture but ingest throughput degrades on wide schemas High Index bloat past ~10M series; per-chunk indexes don't fully avoid metadata pressure Critical OOM at 5-10M active series; linear RAM scaling Medium Handles 10-100M; still has a ceiling on truly unbounded labels Medium Cardinality lives in row data, not metadata; trade-off is column proliferation if you flatten labels
Backfill / late-arriving data Medium Out-of-order writes accepted; compaction reorders; cost in extra Parquet rewrites High Backfill into compressed chunks triggers decompress-modify-recompress; expensive at scale High Backfilling beyond 3-hour window requires offline block generation; current head can't be backfilled Medium Configurable -dedup.minScrapeInterval; out-of-order accepted within deduplication window Medium Inserts to old partitions are cheap; merges handle ordering; materialized views may need backfill
Real-time / point-update support High Append-mostly; updates are essentially rewrites of affected Parquet files Medium Full UPDATE/DELETE in rowstore; compressed chunks need decompress cycle Critical No update semantics; data is immutable once written Critical Append-only; no updates or per-row deletes High ALTER ... UPDATE/DELETE are mutations (async, heavy); ReplacingMergeTree is workaround
Multi-tenancy Medium Database/namespace isolation; RBAC is Enterprise-only Medium Postgres roles + RLS; per-tenant performance isolation is weak Critical No native multi-tenancy; one Prometheus per tenant is the workaround Medium Native accountID/projectID in cluster URLs; logical isolation, shared resources Medium Database/user-level isolation; row policies for fine-grained; performance isolation is up to you
Query language ergonomics Medium SQL primary, InfluxQL compat; Flux is being walked back Medium Full Postgres SQL plus time_bucket and hyperfunctions; verbose for some metrics operations Medium PromQL is excellent for range queries, weak for joins and reports Medium PromQL + MetricsQL extensions; useful additions but cause lock-in if used Medium Full SQL with time-series functions; lacks native PromQL operators like rate()
Operational maturity at scale High v3 Core GA April 2025; production operator experience is still being written Medium Postgres maturity for OLTP, but compression/columnstore subsystem still has open bugs (e.g., issue 8771) Medium Mature single-node; "at scale" means federation, which is a different beast Medium Mature cluster; KISS choices mean fewer surprises but also fewer features Medium Battle-tested at Cloudflare/Uber/Yandex scale; learning curve is steep
HA / replication out of box Critical Replication is Enterprise-only; Core single-node is a SPOF Medium Postgres streaming replication for read replicas; no native multi-master Critical Run two Prometheus side-by-side for HA; no built-in replication Medium Cluster mode native; -replicationFactor flag; cells/AZ architecture for DR Medium ReplicatedMergeTree multi-master; requires Keeper quorum
Resource isolation between writers/readers Medium Separate compactor process; coordinator and ingester can be split High Same Postgres backend serves both; OLAP queries can starve OLTP writes High Single process; heavy queries can starve scrape loop Medium vminsert/vmselect/vmstorage split is the value prop here Medium Resource pools and quotas; Cloud separates compute and storage entirely
Schema evolution Medium Schema-on-write via Line Protocol; adding tags/fields is implicit Medium ALTER TABLE works; new columns on compressed hypertables limited to nullable types Medium Labels are dynamic; no schema enforcement; cardinality risk is inherent Medium Same dynamic labels as Prometheus; same cardinality risk High Schema is explicit; ALTER TABLE on large tables is slow; ORDER BY immutable post-creation
Ecosystem maturity Medium Telegraf, Chronograf, Kapacitor exist but v3 has reset the integration surface Medium Inherits Postgres ecosystem entirely; Grafana, BI tools, ORMs all work Medium 250+ exporters, Grafana-native, Alertmanager; the gold standard for monitoring ecosystem Medium Drop-in for Prometheus ecosystem; vmagent, vmalert, vmauth as native equivalents Medium Strong analytics ecosystem; observability ecosystem (ClickStack, SigNoz, etc) is growing fast

4. Fault Tolerance

Failure modes and operational reality. The interesting cells are where defaults differ from production-grade settings.

Dimension InfluxDB 3 TimescaleDB Prometheus VictoriaMetrics ClickHouse
Replication model Object-store-backed (S3 durability); Enterprise adds node-level replication Postgres streaming replication (leader-follower); sync or async None native; run 2 Prometheus side-by-side, query both App-level via -replicationFactor on vminsert; storage-level optional via persistent disk ReplicatedMergeTree multi-master via Keeper; any replica accepts writes
Failure detection Health endpoints + S3 durability; node failure detected via standard probes Postgres heartbeats + WAL replay status; pg_stat_replication External (Alertmanager / your monitoring of your monitoring) vminsert detects vmstorage unreachable; reroutes; no gossip Keeper-based; replicas heartbeat; replica lag detected via system.replicas
Failover mechanism Restart on healthy node; data already on S3; WAL replay for recent writes External (Patroni, repmgr, pg_auto_failover); not built in Manual; you serve from the surviving instance until both rejoin Automatic reroute; vminsert skips down vmstorage; vmselect tolerates RF-1 down Reads served from any replica; writes blocked if quorum lost
RTO (typical) Minutes (process restart + WAL replay); seconds if compute is pre-warmed 30s-5min depending on failover tooling; Patroni can hit ~10s N/A (no failover); query the other replica immediately Sub-second to seconds; vminsert retries in flight Sub-second for reads (other replica); writes may block during Keeper election
RPO (typical) Sub-second (WAL on object store); seconds if WAL is local-only Zero with sync replication; sub-second async; minutes if relying on WAL archive Last 2 hours of unflushed head block; whatever was after last block flush is lost Zero with RF>=2; otherwise depends on disk durability Near-zero with insert_quorum; sub-second async; minutes if Keeper unreachable
Split-brain behavior S3 strong consistency prevents true split-brain; conflicts surface on read Postgres doesn't allow multi-master; split-brain requires app-level prevention Not applicable; instances are independent No consensus, no split-brain; data may be duplicated across cells Keeper quorum prevents split-brain; minority partition becomes read-only
Blast radius of single-node failure In-memory hot data lost; cold tier in S3 unaffected Single instance loss = all data unreachable until failover Up to retention window of data lost if disk unrecoverable 1/N of shards unreachable until node rejoins; queries get partial results unless RF>=2 One shard's data unreachable; other replicas of same shard serve
Cross-region failover S3 cross-region replication; compute redeployed in DR region Postgres streaming replica in DR region; manual promote Federation or remote_write to central; not a failover model Cell-based architecture replicates across regions; explicit DR pattern ReplicatedMergeTree across regions or external (DR cluster with CDC)
Data loss scenarios WAL not yet uploaded to S3 when node dies; Core single-node = all unflushed data async replication lag at failover; WAL archive gaps Unflushed head block, NFS storage (unsupported), filesystem corruption RF=1 + disk failure = local shard data lost Async insert without quorum; Keeper partition combined with replica failure

5. Sharding

Where each system breaks horizontally. The shard key is permanent in most of these; choose deliberately.

Dimension InfluxDB 3 TimescaleDB Prometheus VictoriaMetrics ClickHouse
Sharding model Time-based partitioning into Parquet files; database namespace separation Hash + time (chunks); multi-node distributed hypertables deprecated post-2.14 None; sharding = run multiple Prometheus instances and federate Consistent hash on (metric_name + labels) across vmstorage nodes Explicit shard key per Distributed table; hash, modulo, or custom
Shard key constraints Time + database/table; tag values not used as shard key Time column is mandatory; optional space partitioning by hash of column N/A (no sharding) Series identity (label set); cannot change without rewriting data Any column; immutable for given Distributed table; common: rand() or modulo of high-cardinality ID
Rebalancing mechanism N/A at app level; S3 handles storage; compute is stateless Manual chunk migration; no native rebalancer N/A No auto rebalance; new nodes only get new series; vmctl for manual rebalance Manual ALTER TABLE ... MOVE PART; or rebuild Distributed table
Rebalancing cost / impact Low; S3 is the source of truth; compute scale is independent High; chunk migration requires lock; not online for active chunks N/A Manual rebalance via vmctl is non-trivial; can take hours and impact query latency High; rebalance on a 100TB cluster can take days; double-disk space during migration
Hot-shard behavior Hot tenant in a single database; isolation via separate databases or namespaces Time-based hotspot (current chunk) is normal and expected N/A; one instance per workload Hot label combination concentrates on one vmstorage; consistent hashing locks placement Hot shard key causes skew; rand() shard helps writes but hurts query locality
Maximum shards (practical) Effectively unlimited; bounded by S3 listing and metadata management 100K+ chunks per hypertable is fine; planner cost grows; multi-node 8-16 nodes was the prior ceiling N/A Tested with 100+ vmstorage nodes per cluster 100s of shards in production; metadata in Keeper becomes the limiter past 1000
Resharding without downtime? Yes (storage is decoupled) No; chunk migration is offline for affected chunks N/A Not automatic; manual vmctl rebalance has online and offline modes Yes with effort; ON CLUSTER + dual-write + cutover patterns
Cross-shard query support DataFusion plans across Parquet files transparently Single-node: chunk pruning; multi-node (deprecated): had cross-node fanout Federation API; degraded query semantics vmselect fanouts to all vmstorage nodes and merges Distributed table fans out; result merge at coordinator

6. Replication

Replication is where the "single-node by design" philosophies show. Treat default settings as marketing, not architecture.

Dimension InfluxDB 3 TimescaleDB Prometheus VictoriaMetrics ClickHouse
Replication topology Storage replication via S3; compute-level replication is Enterprise Leader-follower (Postgres streaming) Independent replicas (no protocol between them) Leaderless; vminsert writes to N consecutive vmstorage nodes Multi-leader (any replica accepts writes for the same shard)
Sync vs async Async to S3 from WAL; configurable upload cadence Both supported; sync replication = synchronous_commit=on N/A; two independent ingestors Sync write to N nodes from vminsert; ack after all succeed Async by default; insert_quorum makes it sync
Replication factor S3 default 3x (provider-managed) 1 leader + N read replicas (no upper bound, practical 5-10) Just run 2; no in-protocol concept RF=1 default; recommended RF=2 or 3; flag-controlled Configurable per shard; commonly 2-3 replicas per shard
Consistency level options Read-your-writes within node; cross-node depends on S3 visibility Read-from-leader strong; read-from-replica eventual Eventual within each instance; cross-instance not guaranteed Tunable via -search.maxQueryDuration and dedup interval insert_quorum + select_sequential_consistency for strong reads
Replication lag (typical) Seconds for WAL-to-S3; sub-second within hot path Sub-second for streaming async replicas in same region Up to 1 scrape interval skew between independent instances Near-zero for sync RF; vmselect merges replica responses Tens of ms within DC; seconds cross-region for ReplicatedMergeTree
Conflict resolution Last-write-wins within a series; idempotent for point-with-same-timestamp Not applicable (single-writer) Up to query layer (HA pair deduplication via Thanos or VictoriaMetrics) Deduplication on read (configurable interval) ReplacingMergeTree / CollapsingMergeTree for explicit conflict handling
Cross-region replication S3 cross-region; Enterprise has explicit cluster-level cross-region Postgres streaming over WAN; latency-sensitive remote_write to central cluster; federation patterns Native cell-based architecture; cells per region with global routing layer ReplicatedMergeTree across regions; common but bandwidth-heavy
Replication during partition S3 unavailability halts uploads; WAL grows locally until S3 returns Async replicas lag; sync replicas block writes if quorum lost Each instance keeps writing locally; no coordination needed vminsert reroutes around unreachable vmstorage; data goes to remaining replicas Minority partition becomes read-only; writes blocked without Keeper majority

7. Better Usage Patterns

Where PE depth shows up. The patterns most engineers miss, the anti-patterns that show up in code review.

InfluxDB 3

Use when object storage economics, Parquet/Arrow interoperability, and SQL over time-series data matter more than raw ingest speed or mature HA in Core.

PatternWhat Most Teams Do WrongThe Better WayWhy It Matters
Tag vs field disciplineTreat tags as free-form metadata; promote anything that might be filtered to a tagTags are indexed and indexed dimensions multiply storage cost. Reserve tags for fields you filter on; everything else is a fieldv3 has unlimited cardinality but indexed-tag count still drives Parquet column count and metadata overhead
Schema-on-write relianceLet Line Protocol auto-create schema; never look at what's been createdPre-declare schema, monitor schema additions, alert on unexpected tag/field appearanceSchema drift is silent in InfluxDB. A typo creates a new measurement and a new schema branch
Compaction tuningAccept defaults; wonder why queries on yesterday's data are slowTune compaction parameters based on retention and query patterns; pin hot rangesCompaction backlog = slow queries on recent data; the canonical warning sign of capacity issues
Python UDF resource boundsRun arbitrary Python in the embedded runtime with no limitsSet explicit memory and CPU bounds per UDF; treat UDFs as untrusted codeA bad UDF can OOM the database. The embedded runtime is convenience, not isolation
Migration from v1/v2Treat as upgrade; reuse Flux tasks and InfluxQL queries; assume API parityTreat as new product. Plan schema migration, query rewrite, and tooling replacementv3 is a different engine. The compatibility layer is partial. Pretending otherwise wastes months
Replication and HARun Core in production assuming "InfluxDB has HA"Core single-node is a SPOF. Use Enterprise, Timestream, or accept SLO impactProduction deployments on Core require explicit HA strategy. Don't discover this during an outage

TimescaleDB (Tiger Data)

Best when the workload benefits from Postgres semantics, joins, extensions, and operational familiarity while accepting single-node or cloud-managed scale limits.

PatternWhat Most Teams Do WrongThe Better WayWhy It Matters
Chunk interval choiceAccept default 7-day interval; discover problems at 100GBChoose interval such that one chunk fits in 25% of shared_buffers; iterateWrong interval is the most common ops issue. Get it right at table-create time, hard to fix later
Compression segmentby/orderbySkip these settings; accept whatever compression you getsegmentby on dimension you filter on; orderby on time DESC; verify ratiosWithout segmentby, point queries decompress entire segments. 8600-row decompression vs targeted row
Continuous aggregate schedulingCreate 20 continuous aggregates with default refresh; CPU spikes every 5 minutesStagger refresh windows; concurrent_refresh in 2.26+; cap parallel jobsRefresh storms starve ingest. Visible as CPU spikes correlated with timer:5m
Backfill into compressed chunksRun UPDATE on year-old compressed data; hit decompress-modify-recompress stormDecompress affected chunks, modify, recompress as batch; or stage in temp table and swapDecompress per row is unbearably slow. Batch the operation
Indexes on hypertablesCreate the same set of indexes as on a regular tableIndex on (time DESC, dimension) for time-range + filter queries; verify per-chunk index sizesIndexes are per-chunk; oversized indexes blow up disk usage. REINDEX is the maintenance cost
Direct Compress on unsorted dataEnable the flag because "37x faster"; ship the changeVerify data is sorted by segmentby+orderby before enabling; treat as tech preview onlyWrong sort causes silent data corruption. Read the warning, run benchmarks first

Prometheus

Choose for service monitoring, scrape-based collection, PromQL alerting, and the exporter ecosystem when single-node retention and HA trade-offs are acceptable.

PatternWhat Most Teams Do WrongThe Better WayWhy It Matters
Label hygieneInclude user_id, request_id, trace_id as labels because "they might be useful"Drop unbounded labels at scrape via metric_relabel_configs; log unbounded values separatelyThe single highest-leverage thing you can do. Unbounded labels are the cardinality bomb root cause
Recording rules vs ad-hoc queriesCompute the same expensive aggregate in every dashboard panelPush expensive aggregates into recording rules; dashboards query the precomputed seriesSaves CPU, makes dashboards snappy, and ensures consistent values across panels
Long-term storage assumptionIncrease retention to 1 year; watch disk fill and queries slowUse Prometheus as 2-week buffer; remote_write to Thanos/Mimir/VictoriaMetrics for long-termPrometheus is not a data warehouse. Treat it as a buffer; storage tier is a different product
HA strategyRun one Prometheus and call it HA because it has WALRun two Prometheus side-by-side scraping the same targets; query both via Thanos/VM dedupWAL protects against process crash, not host loss. HA requires two ingest paths
Histogram bucket designUse default buckets for all latency histograms; get useless quantilesCustom buckets per service; use native histograms (Prometheus 2.40+) for accurate quantilesDefault buckets are calibrated for 10ms-10s. Your service has different SLOs. Native histograms are accurate
Federation vs remote_writeUse federation for long-term centralization; hit query-time fanout painUse remote_write for centralization; federation only for selective high-value seriesFederation fans out at query time; remote_write does it once at write time. Different cost profile entirely

VictoriaMetrics

Best when Prometheus compatibility, high-cardinality tolerance, and simple shared-nothing scaling matter more than consensus-driven replication semantics.

PatternWhat Most Teams Do WrongThe Better WayWhy It Matters
Single-node vs cluster decisionReach for cluster from day one because "production"Run single-node until you exceed its capacity (often 1M+ samples/sec on big hardware)Cluster adds three components to operate. Avoid until you actually need horizontal scale
Replication factor defaultAccept RF=1 default; lose data on disk failureSet RF=2 minimum for production; understand the resource multiplier (linear in N)RF=1 is a "test it works" default. Production needs RF>=2 and capacity planned for it
vmagent vs direct scrapePoint Prometheus at VictoriaMetrics via remote_writeReplace Prometheus with vmagent for scrape + remote_write; cuts an entire moving partvmagent is the lighter scrape-only sibling. Same scrape model, less overhead
MetricsQL extensionsUse MetricsQL extensions everywhere because they're more ergonomicUse MetricsQL only when needed; keep dashboards on standard PromQL for portabilityMetricsQL is vendor sugar. Portable PromQL keeps your options open
Deduplication intervalRun HA Prometheus pair into VM without setting dedup intervalSet -dedup.minScrapeInterval matching your scrape interval; both replicas write but only one winsWithout dedup, queries return duplicated samples and inflated rates
Capacity planningLinear-scale from current ingest; assume you can add nodes laterUse the calculator: storage = ingestion_rate * retention_seconds; double for safetyVM-Cluster has no auto-rebalance. Adding nodes doesn't help old series. Plan capacity, don't react

ClickHouse

Use when the time-series workload is really high-volume analytical data and schema design can be tuned around MergeTree, ORDER BY, and materialized views.

PatternWhat Most Teams Do WrongThe Better WayWhy It Matters
ORDER BY clause designPick ORDER BY based on intuition; discover at 6 months that queries scan whole partitionsDesign ORDER BY around the most selective filter prefix; benchmark before committingHighest-leverage schema decision in ClickHouse. Wrong choice = 100x slower queries forever
LowCardinality misuseSlap LowCardinality on every string column to "save space"Use only when distinct count < 10K; verify with system.parts_columnsAbove 10K distinct values, LowCardinality degrades; dictionary thrashing kills query performance
Materialized views as schema migration toolAdd MVs later when dashboards get slow; backfill manuallyDesign MV strategy at schema time; treat MVs as part of the table definitionMVs in ClickHouse are write-time triggers; adding them later means backfill, which is painful
Insert batchingInsert one row at a time via HTTP API; create millions of tiny partsBatch inserts (100K-1M rows per insert); use Buffer engine or ClickPipes for streamsEach insert = new part; parts merge in background. Small inserts = merge storm, query slowdown
TTL designSet TTL once at table creation; never revisitUse multi-tier TTL: hot SSD → cold S3 → DELETE; align TTL boundaries with dashboard query windowsCold-tier latency hits when dashboard windows cross hot/cold boundary. Align them
Distributed table shardingShard by rand() because "even distribution"Shard by your primary filter column (user_id, tenant_id); query locality matters more than write balancerand() makes writes balanced but reads fan out to all shards. Shard by query pattern

8. Advanced / Next-Gen Alternatives

Successors, adjacent technologies that do specific cases better, and patterns that obviate the original need.

InfluxDB 3

Use when object storage economics, Parquet/Arrow interoperability, and SQL over time-series data matter more than raw ingest speed or mature HA in Core.

AlternativeWhat It ImprovesMaturityMigration CostWhen To Consider
QuestDB12-36x faster ingest, 17-418x faster queries on benchmarks; SIMD-vectorized columnarProductionHigh; different schema and ILP/SQL semanticsPure ingestion throughput matters; high-frequency sensor or financial data
Amazon Timestream for InfluxDB 3Managed InfluxDB 3 with elastic storage and compute; AWS billing integrationProduction (Oct 2025)Low; same API, schema, query languageAWS shops standardizing on managed services; capacity planning offload
Apache IoTDBOptimized for industrial IoT; tree-structured device modelProductionMedium; different data model conventionsIndustrial IoT scenarios with tree-hierarchical device topology
ClickHouse + ClickStackSame FDAP-style benefits via established columnar engine; broader ecosystemProductionHigh; full rewrite of schemas and queriesWant columnar but with deeper observability ecosystem support

TimescaleDB (Tiger Data)

Best when the workload benefits from Postgres semantics, joins, extensions, and operational familiarity while accepting single-node or cloud-managed scale limits.

AlternativeWhat It ImprovesMaturityMigration CostWhen To Consider
Citus + Postgres time-seriesHorizontal scale for Postgres; works for time-series with manual partitioningProductionMedium; Citus model is different from hypertablesNeed horizontal Postgres scale without hypertable abstraction
QuestDB10-50x faster on tick-data workloads; native Postgres wire protocolProductionMedium; queries port mostly with minor adjustmentsHigh-throughput tick or sensor data without need for Postgres ecosystem
ClickHouse with ReplacingMergeTreeFull SQL and analytics; columnar; better at high-cardinality wide tablesProductionHigh; full schema redesign, no Postgres extensionsAnalytics workloads dominating over OLTP; willing to give up ACID transactions
DuckDB + Parquet on S3Embedded analytics; no server to operate; great for offline analysisProductionHigh; not a server, completely different deployment modelAnalytical workloads where data lake + DuckDB is acceptable

Prometheus

Choose for service monitoring, scrape-based collection, PromQL alerting, and the exporter ecosystem when single-node retention and HA trade-offs are acceptable.

AlternativeWhat It ImprovesMaturityMigration CostWhen To Consider
VictoriaMetrics (single or cluster)10x compression; 10x cardinality ceiling; native long-term storageProductionLow; drop-in for Prometheus ingest and query APIsYou're hitting cardinality limits or storage costs are unsustainable
Grafana MimirHorizontally scalable Prometheus with object storage; multi-tenant nativeProductionMedium; new ops surface; gossip-based architectureGrafana Labs ecosystem; large multi-tenant deployments
ThanosLong-term storage on object store; cross-cluster queryProductionMedium; sidecar architecture adds componentsExisting Prometheus deployment; want object storage offload
OpenTelemetry + ClickHouseUnified logs/metrics/traces; vendor-neutral instrumentation; analytics-grade backendEmergingHigh; new instrumentation, new query language, new opsStarting fresh or doing observability platform consolidation

VictoriaMetrics

Best when Prometheus compatibility, high-cardinality tolerance, and simple shared-nothing scaling matter more than consensus-driven replication semantics.

AlternativeWhat It ImprovesMaturityMigration CostWhen To Consider
Grafana MimirObject-storage-native; gossip-based clustering; multi-tenant by designProductionMedium; same query API, different ops modelObject-storage-first architecture; willing to operate gossip protocol
ClickHouse + qrynSame TSDB workload on general OLAP; broader analytics ecosystemEmergingHigh; full migration of schemas and queriesWant metrics + logs + traces unified; willing to leave PromQL behind
VictoriaLogs (sibling product)Same architecture for logs; pairs naturally with VictoriaMetricsProductionLow; complementary, not replacementLooking to extend VM stack into logs without adding ElasticSearch
CortexOriginal distributed Prometheus; predates Mimir but has shrunk in adoptionProduction (declining)Medium; similar to Mimir transitionExisting Cortex deployment; likely transitioning to Mimir

ClickHouse

Use when the time-series workload is really high-volume analytical data and schema design can be tuned around MergeTree, ORDER BY, and materialized views.

AlternativeWhat It ImprovesMaturityMigration CostWhen To Consider
Apache Doris / StarRocksMPP analytics with stronger update semantics and primary-key modelProductionHigh; different SQL dialect and ops modelNeed real-time updates and primary-key semantics that ClickHouse doesn't do well
Apache PinotReal-time analytics with sub-second SLAs; tighter latency guaranteesProductionHigh; different model entirely (segments, deep-store)Sub-second analytics with strict latency SLAs; willing to operate ZK + servers + brokers
Apache DruidStream-first ingestion with native rollup; real-time analyticsProductionHigh; very different architecture (historical/middle-manager/broker)Stream-first workloads with heavy use of rollup and approximate algorithms
DuckDB on Iceberg/ParquetLakehouse-native analytics; no server to operateEmergingHigh; different deployment model entirelyData-lake-centric organizations; analytics workloads that fit serverless query
Snowflake + materialized viewsFully managed; broader BI ecosystem integrationProductionHigh; commercial pricing modelCost-insensitive enterprise; willing to trade self-host control for managed simplicity

Sources: official docs (influxdata.com, tigerdata.com, prometheus.io, victoriametrics.com, clickhouse.com), AWS Timestream for InfluxDB 3 documentation, production benchmarks from QuestDB and Last9, recent post-mortems and ops guides. Verify version-specific claims against release notes before committing to architecture.