QuestDB for Capital Markets?

Learn more

QuestDB 9.1: Precision, Profiling, and Power

Tags:
RedditHackerNewsX
QuestDB is the open-source time-series database for demanding workloads—from trading floors to mission control It delivers ultra-low latency, high ingestion throughput, and a multi-tier storage engine. Native support for Parquet and SQL keeps your data portable, AI-ready—no vendor lock-in.

QuestDB 9.1 is here. Precision and introspection meet performance.

This release introduces nanosecond timestamps, integrated continuous profiling, auto-scaling symbol maps, and smarter JOINs. The result: more precision, more visibility, and more throughput, all in one release.

Let’s dive in.


Nanosecond timestamps

For workloads where every nanosecond counts, QuestDB now supports a new data type: TIMESTAMP_NS.

Creating a nanosecond-precision table
CREATE TABLE ticks (
ts TIMESTAMP_NS,
symbol SYMBOL,
price DOUBLE
) timestamp(ts);
  • TIMESTAMP_NS offers true nanosecond precision, ideal for high-frequency trading, sensor data, or sub-microsecond event tracking.
  • The existing TIMESTAMP type remains unchanged (microsecond precision).
  • You can use TIMESTAMP_NS anywhere you would use a regular timestamp, in filters, ordering, joins, or aggregates.

Backwards compatibility is preserved: older tables continue to use microseconds. New ones can opt in to nanosecond precision for full analytical accuracy.

TIP

SAMPLE BY, ASOF JOIN, and window functions all support nanosecond timestamps.


Continuous profiling

Understanding performance has never been easier.

QuestDB 9.1 integrates the Async Profiler, the standard low-overhead profiler for the JVM, directly into the server.

You can now capture CPU or allocation flame graphs continuously or on demand, without any external setup.

Capture a 30-second CPU profile
questdb.sh profile -- -e cpu -d 30 -f /tmp/cpu.html

Profiles are exported as interactive HTML flame graphs or JFR (Java Flight Recorder) files.

  • Zero overhead when idle
  • Around 10% overhead when active
  • No restart required

Use it to trace slow queries, high CPU usage, or unusual memory patterns, in production or during load tests.

Flamegraph from QuestDB's built-in profiler
Flamegraph from QuestDB's built-in profiler

Symbol capacity auto-scaling

Symbol ingestion just got a huge speedup.

Previously, symbol map capacity was fixed at table creation. Undersizing it could cause ingestion to stall at around one million unique values.

Now, with auto-scaling enabled, QuestDB dynamically grows symbol capacity as data arrives:

CardinalityIngestion time (9.0)Ingestion time (9.1)
2 millionpotentially hours2.5 seconds
40 millionpotentially never finished2.5 minutes

Enable it with one config line:

server.conf
cairo.auto.scale.symbol.capacity=true

Or via env variable:

env variable
QDB_CAIRO_AUTO_SCALE_SYMBOL_CAPACITY=true

No restart required.

This feature is ideal for datasets with unpredictable symbol cardinality, such as telemetry, IoT devices, or ticker-level market feeds.


JOIN improvements

Query expressiveness gets a major upgrade.

  • Support for all JOIN types (including RIGHT OUTER and FULL OUTER)
  • ASOF JOIN is now much faster on indexed columns
  • Smarter query rewriting for better optimizer performance
Full outer join example
SELECT *
FROM quotes q
FULL OUTER JOIN trades t
ON q.symbol = t.symbol AND q.timestamp = t.timestamp;

This makes QuestDB’s join engine one of the most complete and performant among time-series databases.

For temporal analytics, the improved ASOF JOIN supports nanosecond precision and indexed lookups, making tick-stream matching faster and more accurate.


New or improved SQL functions

New tools for time-series developers:

  • SHOW COLUMNS now displays symbol table sizes, offering instant visibility into symbol memory usage.
  • New window functions first_value, 'last_value, max, and minnow supporttimestampandlong` data types.
  • rnd_symbol_zipf()for generating skewed symbol distributions in synthetic workloads.
  • Vectorized avg(short) and optimized sum() for lower memory use.

Performance and stability

We have made many incremental improvements across the engine:

  • Faster IN (...) list evaluation for large lists (breaking change)
  • Dedicated thread pool for materialized view refreshes
  • Dozens of fixes for WAL, index drops, and table lifecycle edge cases
  • Better error handling and reliability under OS-level I/O failures

The new hash-based IN list evaluation delivers big speedups for queries with thousands of constants, common in filtering or ACL checks.

If you rely on JIT for large IN lists, you can adjust the threshold:

server.conf
cairo.sql.jit.max.in.list.size.threshold=10000

Or

env variable
QDB_CAIRO_SQL_JIT_MAX_IN_LIST_SIZE_THRESHOLD=10000

Roundup

QuestDB 9.1 focuses on precision, profiling, and performance.

  • Nanosecond timestamps bring ultra-fine temporal analytics.
  • Continuous profiling provides real-time visibility into system behavior.
  • Auto-scaling symbols remove ingestion bottlenecks.
  • JOINs and IN lists are faster and more capable than ever.

Read the full release notes →

Ready to try it?

👉 Download QuestDB 9.1

Join our Slack or Discourse to share feedback and performance results. We can’t wait to see what you build.

Subscribe to our newsletters for the latest. Secure and never shared or sold.