Summary
Materialized views that keep rows rather than time buckets: projection views that hold a filtered, column-selected mirror of a base table, latest-by views that hold the current row per key, and join views that enrich base rows with other tables. They use today's refresh model, reading from the base table once its WAL transactions have been applied, and refresh incrementally like SAMPLE BY views. Row-level retention keeps them bounded.
Current Limitations
- Materialized views require
SAMPLE BY or a time-based GROUP BY; a view cannot simply keep rows
- The current state per key needs a
LATEST ON scan over the base table on every read
- Enrichment without aggregation, such as an
ASOF JOIN of trades with quotes, cannot be materialized
- There is no way to keep a bounded, continuously pruned copy of a table
Features
| Feature |
Description |
| Projection views |
A filtered, column-selected mirror of the base table that refreshes incrementally as rows arrive |
| Latest-by views |
One row per key holding the most recent state, maintained as data arrives instead of a LATEST ON scan per query |
| Join views |
Base rows enriched through JOIN, including ASOF JOIN, with no SAMPLE BY required; the base table triggers refresh, and refresh from joined tables is tracked in #114 |
| Row-level retention |
EXPIRE ROWS on a view: expire by predicate, keep the latest row per key, or keep the N highest or lowest per group, with background reclamation where the predicate allows |
| Same tooling |
Incremental refresh, TTL, SHOW CREATE MATERIALIZED VIEW, materialized_views() and replication behave as for existing views |
How it works
- The view declares its query; no
SAMPLE BY is needed.
- As WAL transactions are applied to the base table, the view refreshes incrementally over the new rows.
- Reads over a view with a retention policy are filtered so expired rows disappear immediately, and disk is reclaimed in the background.
Example
Illustrative syntax:
-- projection: a filtered mirror of trades
CREATE MATERIALIZED VIEW aapl_trades AS (
SELECT timestamp, price, amount FROM trades WHERE symbol = 'AAPL'
);
-- latest-by: current state per key, bounded by retention
CREATE MATERIALIZED VIEW positions AS (
SELECT * FROM fills
) EXPIRE ROWS KEEP LATEST ON timestamp PARTITION BY account, symbol;
-- join: trades enriched with the prevailing quote
CREATE MATERIALIZED VIEW enriched_trades WITH BASE trades AS (
SELECT t.timestamp, t.symbol, t.price, q.bid, q.ask
FROM trades t ASOF JOIN quotes q ON (symbol)
);
Benefits
Scope
Implementation: questdb/questdb#7263. Related: #114 (refresh triggered by joined tables). Followed by #137, which moves all views onto the WAL-fed live view model.
Summary
Materialized views that keep rows rather than time buckets: projection views that hold a filtered, column-selected mirror of a base table, latest-by views that hold the current row per key, and join views that enrich base rows with other tables. They use today's refresh model, reading from the base table once its WAL transactions have been applied, and refresh incrementally like SAMPLE BY views. Row-level retention keeps them bounded.
Current Limitations
SAMPLE BYor a time-basedGROUP BY; a view cannot simply keep rowsLATEST ONscan over the base table on every readASOF JOINof trades with quotes, cannot be materializedFeatures
LATEST ONscan per queryJOIN, includingASOF JOIN, with noSAMPLE BYrequired; the base table triggers refresh, and refresh from joined tables is tracked in #114EXPIRE ROWSon a view: expire by predicate, keep the latest row per key, or keep the N highest or lowest per group, with background reclamation where the predicate allowsSHOW CREATE MATERIALIZED VIEW,materialized_views()and replication behave as for existing viewsHow it works
SAMPLE BYis needed.Example
Illustrative syntax:
Benefits
LATEST ONscanScope
KEEP LATESTretentionASOF JOINEXPIRE ROWSretention policies with background reclamationImplementation: questdb/questdb#7263. Related: #114 (refresh triggered by joined tables). Followed by #137, which moves all views onto the WAL-fed live view model.