QuestDB 8.2.2 - New real-time monitoring, Table TTL and more
2025 is a fresh new year. There's a renewed sense of optimism, and we're pleased to ride that wave into our latest release. QuestDB had a massively successful year in 2024, being the only time-series database to show significant growth in global DB-Engines ranking. And we're just getting started.
But enough about that, you're here for the goods!
For itemized patch notes, see our release notes page.
Real-time QuestDB monitoring
How you monitor QuestDB is your choice. To provide our community with a strong out-of-the-box option, we've added a new monitoring dashboard to the Web Console. To access it, click the new Add metrics icon above the table view:
The dashboard can be tailored to show you what you want to track. All data is shown in real-time from internal telemetric data. Now, no third-party service is required to monitor your QuestDB instance. Customize the timezone, time-frame and refresh rate to your liking:
Parallelized Parquet queries
Parquet file reading received a nice boost. The read_parquet()
SQL function now supports parallel execution, leveraging QuestDB's query engine to process Parquet files with the same parallel filtering and aggregation capabilities as native tables:
EXPLAIN SELECTsymbol,max(price)FROM read_parquet('trades.parquet');
Parquet queries will now take full advantage of multiple CPU cores, improving performance for large datasets. The parallelization is particularly effective for:
- Complex filtering operations
- Aggregations across large datasets
- Group by operations
If you need to disable parallel execution for any reason, you can do so via the cairo.sql.parallel.read.parquet.enabled
configuration property:
cairo.sql.parallel.read.parquet.enabled=false
New SQL syntax
Headlining this release is a great new tool to manage historical data, and new SQL syntax to help you write performant and concise queries.
Time-to-Live (TTL) for tables
Managing historical data can become a pain-point. Table TTL lets you set an expiration time for your data, automatically removing old partitions as new data arrives. Ideal for maintaining rolling windows of recent data without manual cleanup:
-- Keep only the last 7 days of dataCREATE TABLE metrics (ts TIMESTAMP,sensor_id SYMBOL,value DOUBLE) timestamp(ts)PARTITION BY DAYTTL 7d;-- Or add TTL to existing tablesALTER TABLE metrics TTL 7d;
QuestDB handles the cleanup automatically as part of regular operations, dropping entire partitions when they fall outside your TTL window. This makes it incredibly efficient for managing large-scale time-series data.
DECLARE
Ever find yourself repeating the same values across a complex query? The new DECLARE
keyword lets you define variables once and use them throughout your SQL. It's handy for date ranges, sampling periods, and frequently used values:
DECLARE@period := 1h,@symbol := 'BTC-USD',@window := today()SELECTtimestamp,symbol,avg(price) as avg_priceFROM tradesWHERE symbol = @symbolAND timestamp IN @windowSAMPLE BY @period;
New window functions
QuestDB 8.2.2 introduces several new window functions. Whether you're new to them or a seasoned pro, our documentation will help you get started.
Lead
The lead()
function accesses data from subsequent rows in your result set. This is particularly useful for comparing current values with future values.
SELECTtimestamp,price,future_price,future_price - price AS momentumFROM (SELECTtimestamp,price,LEAD(price, 10) OVER (ORDER BY timestamp) AS future_priceFROM (SELECTtimestamp,avg(price) AS priceFROM tradesWHERE timestamp BETWEEN now() AND dateadd('d', -1, now())AND symbol = 'BTC-USD'SAMPLE BY 10m))
Lag
The lag()
function accesses data from previous rows, perfect for comparing current values with historical ones.
SELECTtimestamp,price,lag(price) OVER (PARTITION BY symbolORDER BY timestamp) as previous_priceFROM trades;LIMIT 20;
Last value (not null?)
Returns the last value in a window frame, with support for NULL handling through IGNORE NULLS
.
SELECTtimestamp,symbol,price,last_value(price) OVER (PARTITION BY symbolORDER BY timestampROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as last_priceFROM trades;LIMIT 20;
First value (not null?)
Returns the first value in a window frame, with support for NULL handling through IGNORE NULLS
.
SELECTtimestamp,symbol,price,first_value(price) OVER (PARTITION BY symbolORDER BY timestampROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as first_priceFROM trades;LIMIT 20;
New functions
Like most releases, we've added new sugar to help you write performant SQL.
Timezone aware dateadd()
The dateadd()
function now supports timezone awareness, making it easier to perform date arithmetic across different timezones. This is particularly useful when working with global time-series data.
SELECTtimestamp,dateadd('h', 1, timestamp, 'PST') as one_hour_later_pst,dateadd('h', 1, timestamp, 'EST') as one_hour_later_estFROM trades;LIMIT 20;
Reloadable settings
Downtime is (usually) never helpful. To keep QuestDB up and humming, we've added reloadable configurations. You can now reload certain settings without restarting QuestDB. To do so, update your server.conf
file and use the new reload_config()
function:
SELECT reload_config();
The server will confirm successful changes in the logs, and you can check which settings are reloadable:
(SHOW PARAMETERS) WHERE reloadable = true;
The configuration documentation also has a new column to indicate whether or not a setting can be reloaded on the fly.
Query tracing
Ever wonder which queries are slowing down your system? Query tracing lets you diagnose performance issues by recording execution times in a system table. Enable it with a simple configuration:
query.tracing.enabled=true
Once enabled, QuestDB records query execution data in the _query_trace
table. You can analyze this data using regular SQL to identify slow queries:
SELECTts,query_text,execution_micros / 1000.0 as execution_msFROM _query_traceWHERE execution_micros > 100_000ORDER BY execution_micros DESC;
The system automatically maintains this table, dropping data older than 24 hours to keep storage usage in check. And like other configuration changes, you can enable tracing without a restart using reload_config()
.
We're now questdb.com
While it doesn't impact the core database or this version, we'd like to let you know that we've updated our primary domain to questdb.com. This is a permanent change, and we've updated all our links and references to the new domain.
Why? First, because we've heard some uncertainty around the .io domain. And second, the new .com
is more familiar and professional, with that little extra panache that reminds us of the good ol' days.
Summary
QuestDB 8.2.2 is a solid release - upgrade to get the latest. The Web Console's new built-in monitoring dashboard gives you instant visibility into your system's performance, while Table TTL simplifies data lifecycle management. Parallelized Parquet reads give a solid performance boost, and set the table for deeper Parquet improvements.
We've also expanded our analytics capabilities with new window functions, made query writing more elegant with DECLARE
, and improved timezone handling with enhanced date functions. With the new reloadable settings function, you can even tweak your server configuration without restarting your instances. The new query tracing feature helps you identify performance bottlenecks by tracking query execution times.
As usual, along with a run of new features, QuestDB 8.2.2 brings a battery of bug fixes and performance improvements. Download QuestDB 8.2.2 and let us know what you think within our Community Forum or our public Slack.