We just released #QuestDB 9.4.2.
Shareable Web Console queries, new array_agg() and regr_r2() aggregates, DECIMAL window functions, faster materialized view refresh during out-of-order backfills, and hardening across Parquet and posting indexes.
Release notes in thread 👇
Low latency no longer requires proprietary infrastructure.
Aeron and #QuestDB are part of a growing ecosystem of open technologies being adopted across capital markets.
Link in thread 👇
The AI conversation in finance is moving quickly from copilots to systems that can read papers, implement models, and run backtests.
Interesting discussion at STAC Chicago with experts from Virtu, Attucks, Tenstorrent, Weights & Biases, and #QuestDB.
Most aggregate functions reduce many values to a single result.
array_agg() in #QuestDB takes a different approach, collecting those values into an array within each group or sampled interval.
Link in thread 👇
ALT QuestDB banner introducing the new array_agg() SQL function. Headline reads "Many rows in, one array out." with the code snippet array_agg(price) → DOUBLE[]. A diagram shows a column of price values (1.1922, 1.1928, 1.1925, 1.1927, 1.1926, 1.1924, 1.1929) converging into a single DOUBLE[] array, labeled "1 array, order preserved."
With storage policies in #QuestDB, data can automatically move to object storage as Parquet.
The same dataset can then be queried from QuestDB, Athena, DuckDB, or any other Parquet-compatible engine. No exports, no copies, no ETL.
Running a regulated futures exchange 24/7 leaves very little room for operational surprises
In our latest case study, One Trading explains why they chose #QuestDB to power market data and analytics for Europe’s first MiFID II-regulated perpetual futures venue
Link in thread 👇
Order Flow Imbalance is one of the most useful microstructure signals, and you can calculate the Cont, Kukanov, and Stoikov formulation directly in SQL with #QuestDB.
You can try the recipe over 2.5M core_price rows from yesterday on the public demo instance.
Link in thread
ALT A wide dark-navy data-visualization banner. Headline reads "Order Flow Imbalance" with the subtitle "The Cont · Kukanov · Stoikov estimator, computed in pure SQL." Below, a time series of order-flow imbalance is drawn as a diverging bar chart around a zero baseline: green bars pointing up indicate net buy pressure and red bars pointing down indicate net sell pressure. A translucent highlighted window frames one contiguous slice of the series. A legend labels green as "buy pressure" and red as "sell pressure," and the QuestDB logo sits in the lower-left corner.
Time-series workloads expose the limits of traditional SQL surprisingly quickly.
Some patterns become verbose. Others become inefficient. Some are simply impossible to express naturally.
We published a new docs page on the SQL extensions in #QuestDB.
Link in thread 👇
ALT QuestDB banner titled "SQL extensions for time-series." Subtitle: "Some operations are verbose, others are hard to optimize, and some patterns do not map cleanly to relational semantics. QuestDB extends SQL where time-series workloads need different primitives." On the right, six numbered feature cards in a 2×3 grid name the extensions: 01 LATEST ON, 02 SAMPLE BY, 03 Time-aware joins, 04 Designated timestamps, 05 Temporal filtering, 06 Order books as arrays.
Time-series databases prefer ordered data, and #QuestDB is optimized for that fast path.
But delayed events, retries, distributed pipelines, and historical backfilling happen in real systems. Our docs explain how QuestDB handles out-of-order ingestion.
Link in thread 👇
ALT QuestDB banner titled "Out-of-order data, handled by design." A process pill reads "WAL → SPLIT → SQUASH". To the right, three stacked timelines tell the story: (1) nine timestamp chips in WAL arrival order, with two chips marked "late" highlighted in pink because their timestamps came earlier than the chips before them; (2) the same chips re-sorted chronologically, with pink dashed seams dividing the partition into three sub-partitions and the middle segment labeled "split insert"; (3) a single solid pink bar labeled "one ordered partition · 9 rows", showing the consolidated result after the background squash.
Exactly-once processing can sound intimidating, but it doesn't need to be.
In #QuestDB, you enable deduplication with DEDUP UPSERT KEYS(...) and the database takes care of duplicate retries and replays for you, with very little performance overhead.
Link in thread 👇
ALT QuestDB banner titled "Exactly once, by upsert key." A SQL snippet reads DEDUP UPSERT KEYS(ts, symbol). To the right, a small diagram shows six incoming WAL rows on the left collapsing into four stored rows on the right. Two pairs of incoming rows share the same timestamp and symbol — they're highlighted in pink and bracketed with a "key match" label, with the older value struck through. Curved arrows fold each duplicate group into a single canonical row in the deduped output column. A counter at the bottom reads "6 rows in" → "4 rows stored."
Have you tried the new covering indexes in #QuestDB yet?
For highly selective queries on high-cardinality SYMBOL columns, included values are stored contiguously per key, turning scattered reads into sequential scans.
ALT Diagram explaining QuestDB covering indexes and covering sidecars for high-cardinality SYMBOL queries. The top section shows rows stored in timestamp arrival order, where values for the same symbol are scattered across the column file, requiring many random reads for queries like WHERE sym = 'AAPL'. The lower section shows the new covering sidecar layout, where rows for each symbol are physically grouped contiguously, allowing sequential reads over compressed per-key blocks. Additional panels show the compression strategies used for different data types, including ALP for floating point values, FoR bit-packing for integers, linear prediction plus FoR for timestamps, and FSST compression for text.
We already support Parquet in #QuestDB through conversion workflows and storage policies.
We are now working on letting tables write future partitions directly as Parquet, giving more flexibility around open-format storage.
ALT QuestDB banner: "Parquet partitions, from day one." A SQL snippet reads PARTITION BY DAY FORMAT PARQUET. On the right, a timeline of daily partitions shows three older partitions in the native row-oriented format (Dec 02–04) followed by a pink "Format → Parquet" boundary, then five future partitions written as Parquet with column stripes (Dec 05–09). Existing partitions are retained; future ones are written as Parquet from inception.