QuestDB 9.1: Precision, Profiling, and Power
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
.
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.
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.

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:
Cardinality | Ingestion time (9.0) | Ingestion time (9.1) |
---|---|---|
2 million | potentially hours | 2.5 seconds |
40 million | potentially never finished | 2.5 minutes |
Enable it with one config line:
cairo.auto.scale.symbol.capacity=true
Or via 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
andFULL OUTER
) - ASOF JOIN is now much faster on indexed columns
- Smarter query rewriting for better optimizer performance
SELECT *FROM quotes qFULL OUTER JOIN trades tON 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 support
timestampand
long` data types. rnd_symbol_zipf()
for generating skewed symbol distributions in synthetic workloads.- Vectorized
avg(short)
and optimizedsum()
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:
cairo.sql.jit.max.in.list.size.threshold=10000
Or
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.
Ready to try it?
Join our Slack or Discourse to share feedback and performance results. We can’t wait to see what you build.