Migration Guide, Tested End-to-End

Migrate from QuestDB

Keep your Line Protocol pipeline, bulk-load your history, and translate your queries to standard SQL. The same dataset lands in 13.8 GiB of portable Parquet instead of QuestDB's 67.9 GiB, with the full analytical SQL surface on top.

4.9x
smaller storage
4.3x
faster cold runs
93x
faster to load

Every command in the guide was tested against QuestDB 9.4.3 and Arc 26.06.3.

Why teams move

QuestDB is fast at high-frequency ingestion. Where teams outgrow it is analytical depth and storage cost, and both are a smooth migration, not a rewrite.

Storage cost

4.9x smaller, and you own it

The ClickBench dataset fills 67.9 GiB in QuestDB and 13.8 GiB of Apache Parquet in Arc. On object storage that's roughly five times the bytes you pay for every month, and Arc's Parquet is queryable in place by any tool, so there's no export step if you leave.

Query engine

Full standard SQL

Arc runs a vectorized analytical engine with the complete standard-SQL surface. Window functions, CTEs, and complex joins run without a penalty. QuestDB's SAMPLE BY and LATEST ON have direct, tested equivalents.

Ingestion

Line Protocol on both sides

Both accept InfluxDB Line Protocol, so your Telegraf and ILP writers re-point with a URL change. Arc also speaks a MessagePack columnar protocol for high-throughput ingest, plus bulk CSV and Parquet import.

Migration in three steps

Re-point live writes, bulk-load history, translate queries. Here's the shape of each. The full walkthrough is in the docs.

1

Re-point live ingestion

Arc exposes an InfluxDB 1.x-compatible /write endpoint. Send the exact line protocol you send QuestDB; only the URL and token change.

curl -X POST "http://localhost:8000/write?db=metrics&precision=ns" \
  -H "Authorization: Bearer $ARC_TOKEN" \
  --data-binary 'cpu,host=server01 usage_idle=95.0 1700000000000000000'
2

Bulk-load your history

Export each table from QuestDB's /exp endpoint to CSV, then import it into Arc. Arc auto-detects QuestDB's RFC 3339 timestamps.

curl -G "http://localhost:9000/exp" \
  --data-urlencode "query=SELECT * FROM cpu" -o cpu.csv

curl -X POST "http://localhost:8000/api/v1/import/csv?measurement=cpu&time_column=timestamp" \
  -H "Authorization: Bearer $ARC_TOKEN" -H "X-Arc-Database: metrics" \
  -F "file=@cpu.csv"
3

Translate your queries

QuestDB's time-series extensions map to standard SQL. The results match exactly.

-- QuestDB:  SELECT timestamp, avg(usage_idle) FROM cpu SAMPLE BY 1h
-- Arc (send header  X-Arc-Database: metrics  and keep bare table names):
SELECT time_bucket(INTERVAL '1 hour', time) AS bucket, avg(usage_idle)
FROM cpu GROUP BY 1 ORDER BY 1;

QuestDB SQL → Arc SQL

Every QuestDB extension has a direct standard-SQL equivalent that returns identical results.

QuestDBArc (standard SQL)
SAMPLE BY 1htime_bucket(INTERVAL '1 hour', time)
LATEST ON ts PARTITION BY symDISTINCT ON (sym) … ORDER BY sym, time DESC
Designated timestamp (implicit)Explicit WHERE time >= … ORDER BY time
dateadd('d', -7, now())now() - INTERVAL '7 days'
to_timezone(ts, 'UTC')time AT TIME ZONE 'UTC'

Frequently Asked Questions

Do I have to rewrite my ingestion pipeline to move from QuestDB to Arc?

No. QuestDB and Arc both accept InfluxDB Line Protocol, so any Telegraf pipeline or ILP client keeps its exact payload. You change the destination URL and add an Arc token. Arc exposes an InfluxDB 1.x-compatible /write endpoint that ingests the same line protocol QuestDB does.

How do I move my historical QuestDB data into Arc?

Export each QuestDB table to CSV through its /exp REST endpoint, then bulk-import the file into Arc with POST /api/v1/import/csv. Arc auto-detects the RFC 3339 timestamps QuestDB produces and renames the timestamp column to Arc's time column. This round-trip is documented and tested at docs.basekick.net/arc/migration/questdb.

What replaces QuestDB SAMPLE BY and LATEST ON in Arc?

Arc runs standard SQL. SAMPLE BY maps to time_bucket(INTERVAL '1 hour', time) with GROUP BY; LATEST ON maps to DISTINCT ON or a ROW_NUMBER() window function. Both produce identical results to their QuestDB equivalents, and you also get the full analytical SQL surface: CTEs, window functions, and complex joins.

Does Arc really store the same data in less space than QuestDB?

Yes. On the ClickBench dataset (99.9M rows), QuestDB stores 67.9 GiB while Arc stores the same data in 13.8 GiB of Apache Parquet, 4.9x less. Arc's Parquet is queryable in place by any Parquet-compatible tool with no export step.

See the tested, step-by-step guide at docs.basekick.net, or compare the two head-to-head in Arc vs QuestDB. Benchmark methodology on benchmark.clickhouse.com.

Ready to handle billion-record workloads?

Deploy Arc in minutes. Own your data in open files on your storage. Use for analytics, observability, AI, IoT, or data warehousing.

Get Started ->