Skip to content

Conversation

@renovate
Copy link

@renovate renovate bot commented Oct 3, 2025

This PR contains the following updates:

Package Change Age Confidence
org.questdb:questdb (source) 9.0.3 -> 9.1.0 age confidence

Release Notes

questdb/questdb (org.questdb:questdb)

v9.1.0

Compare Source

QuestDB 9.1.0 is now available. It is a feature-rich release bringing nanosecond timestamp data type, performance and stability improvements.

Highlights

  • Nanosecond timestamps: New TIMESTAMP_NS type adds nanosecond precision to time-series data (#​5685).
  • Continuous profiling: Integrated async-profiler lets you capture CPU and memory flame graphs continuously or on demand (#​6150).
  • JOIN improvements: Support for all JOIN types including RIGHT OUTER and FULL OUTER, plus dramatically faster ASOF JOINs on indexed columns (#​6158, #​6076).
  • New SQL functions: Added timestamp and long window functions, plus visibility into symbol table size via SHOW COLUMNS (#​6130, #​6128).
  • Performance wins:
    • Symbol map auto-scaling: Eliminates ingestion bottlenecks from fixed symbol capacity. Now millions of distinct values ingest in seconds instead of hours.
    • Faster IN (...) queries on large lists (breaking change 💥).

Nanosecond timestamp support 🛡️

QuestDB now supports nanosecond precision with a new data type: TIMESTAMP_NS.

  • The existing TIMESTAMP type remains microsecond precision and is unchanged.
  • TIMESTAMP_NS can be used in all contexts where TIMESTAMP is valid (columns, functions, joins, ordering, etc.).
  • Migration: No changes are required for existing tables. They will continue to use TIMESTAMP (microsecond).
  • Rollback compatibility:
    • If you do not create tables with TIMESTAMP_NS, you can safely roll back to QuestDB 9.0.3 or earlier.
    • If you do create tables with TIMESTAMP_NS, older versions will not recognize this type. Such tables must be dropped before rolling back.
  • Drivers and client libraries: TIMESTAMP_NS is supported by existing QuestDB drivers (JDBC, Go, Python, etc.), provided you are on a recent release of the driver. No protocol upgrade or client code changes are required.

Symbol map auto-scaling (opt-in)

Symbol column map capacity now scales automatically with the number of distinct values, removing one of the biggest friction points in high-ingestion workloads.

  • Before: symbol map capacity was fixed at table creation.

    • If undersized, ingestion performance could degrade by up to 1000×, often making ingestion practically impossible.
    • For example, on default settings the system would bog down at ~1,000,000 unique symbols, taking several hours to ingest that data (unless the user had pre-sized the symbol map correctly).
  • Now: with auto-scaling enabled, symbol capacity grows dynamically:

    • ~2,000,000 distinct values ingested in 2.5 seconds (vs hours).
    • ~40,000,000 distinct values ingested in 2.5 minutes (vs never finishing before).
  • Backward compatibility:

    • Auto-scaling is opt-in to preserve compatibility.
    • Enabling it stores metadata in a new structure that older versions cannot read.
    • If rollback is required, data does not need to be dropped, but some manual file renaming steps are necessary. Users can contact QuestDB support for guidance.
  • Opt-in instructions:

Enable via configuration property, system's restart is not required:

cairo.auto.scale.symbol.capacity=true

Continuous profiling support (opt-in)

QuestDB now ships with the Async Profiler integrated out-of-the-box. This dramatically reduces friction when diagnosing performance issues such as high CPU usage or queries that appear slow.

  • Ease of use: the profiler is bundled, no manual installation required.
  • Opt-in: profiling has no impact on performance unless enabled.
  • Performance impact:
    • 0% overhead when not in use.
    • ~10% overhead when the profiler is actively connected.
  • Modes of use:
    1. Start with profiling enabled – less common, but can help during development or long-running load tests.
    2. Attach to a running instance – the most useful mode, allows “catching the system in the act” when issues are intermittent or difficult to reproduce.
Examples

Start a 30s CPU profiling session and generate an interactive HTML flamegraph:

questdb.sh profile -- -e cpu -d 30 -f /tmp/cpu.html
image

SQL & Query Engine

  • Nanosecond timestamp support for ultra-high resolution time-series workloads (#​5685).
  • New window functions for timestamp and long data types (#​6130).
  • Symbol table size visibility added to SHOW COLUMNS (#​6128).
  • Optimized IN (...) comparisons on long lists — breaking change 💥 (#​6109).
  • Enhanced JOIN execution with multiple improvements (#​6076).
  • Faster ASOF JOIN on indexed symbol columns (#​6158).
  • Vectorized avg(short) and improved sum() functions memory usage (#​6166).
  • GROUP BY queries now rewrite trivial expressions over the same column for better performance (#​6043).
  • Improved null-handling in INSERT INTO SELECT queries with implicit casting (#​5586).
  • Consistent behavior of EXPLAIN command (#​6200).
  • Fixed NPE in DISTINCT queries with dependent columns (#​6080).
  • Fixed compilation error for symbol column to symbol cast in GROUP BY queries (#​6072).
  • Fixed nanosecond precision issues in ASOF JOIN TOLERANCE and CSV imports (#​6183).
  • Prevented multiple DECLARE statements in single query block (#​6161).
  • Fixed rare assertion error after metadata changes (#​6195).

Ingestion (ILP)

  • Improved handling of symbol ingestion with double column conversion (#​6143).
  • Retry logic fixed when fetching server protocol version (#​6099).
  • Support for configuring multiple possible database endpoints (#​6074).
  • Improved connection handling — now avoids closing connections on protocol errors (#​6190).

Core & Operations

Continuous profiling support

QuestDB now integrates the Async Profiler for low-overhead performance diagnostics.

  • Modes:
    • Continuous profiling at startup (questdb.sh start -p)
    • On-demand attach to running instances for CPU or allocation traces
  • Outputs:
    • Interactive HTML flame graphs
    • JFR (Java Flight Recorder) output (#​6150)
Threading and resource usage
  • Materialized view refreshes now run on a dedicated thread pool (#​6111)
Reliability fixes
  • Fixed rare index reader memory error on partition drop (#​6087)
  • Fixed suspended table showing wrong writerTxn (#​6090)
  • Fixed table read timeout after non-WAL drop/re-create (#​6095)
  • Fixed rare suspension on index drop (#​6147)
  • Fixed misleading “table locked” error appearing before write failures (#​6152)
  • Fixed failure handling on column renames (#​5752)
  • Fixed spurious “cannot mmap” errors (#​6104)
  • Fixed incorrect error handling that could leave table reader in an inconsistent state (#​6108)
  • Fixed memory tags used in Path (#​6124)
  • Fixed assertion exception in writer triggered by OS errors (#​6204)

Breaking change 💥

IN list queries now use hash-based lookups instead of binary search, delivering significant performance gains for large lists.

  • Performance: Faster execution for queries with thousands of IN values.
  • Configuration: JIT compilation is skipped for lists larger than cairo.sql.jit.max.in.list.size.threshold (default: 10,000).
  • Behaviour: Results remain equivalent, but execution order and memory usage may differ in edge cases.

Migration guidance:

  • No SQL syntax changes are required
  • If you notice regressions for small lists or need JIT for large lists, adjust cairo.sql.jit.max.in.list.size.threshold.
  • Benchmark your workloads to tune the threshold for optimal results.
  • Expect faster performance for large IN lists out of the box.

This change matters most for queries with very large IN lists (thousands of values), often seen in data filtering, batch imports, or security/ACL checks. These workloads will now execute much faster by default.

What's Changed

New Contributors

Full Changelog: questdb/questdb@9.0.3...9.1


Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate bot force-pushed the renovate/org.questdb-questdb-9.x branch from f04eafe to b78c53f Compare October 10, 2025 21:10
@renovate renovate bot force-pushed the renovate/org.questdb-questdb-9.x branch from b78c53f to a243acb Compare October 21, 2025 14:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants