Database guides
QuestDB
High-performance time-series SQL over the Postgres wire, on QuestDB’s own port 8812.
QuestDB speaks the PostgreSQL wire protocol, so AddisDB connects with the Postgres driver — but on port 8812, QuestDB’s own default, rather than 5432.
Who it is for
QuestDB is built for ingest speed and time-ordered scans. It adds time-series SQL extensions that are genuinely useful — SAMPLE BY for downsampling, LATEST ON for the most recent row per series, ASOF JOIN for aligning series that were not sampled together.
Storage is column files ordered by a designated timestamp, so a range scan is a contiguous read and the engine never has to sort to answer a time-ordered query. That is also why the designated timestamp is not optional in practice: without it, the extensions that make QuestDB worth using do not apply.
It suits financial market data, industrial and IoT telemetry, and application metrics at high ingest rates where you still want plain SQL rather than a bespoke query language.
Set up the server
- Local: docker run -p 9000:9000 -p 8812:8812 questdb/questdb. Port 9000 is the web console; 8812 is the Postgres wire endpoint AddisDB uses.
- QuestDB Cloud: create an instance and copy the host and credentials from the console.
- The default credentials on a local instance are admin / quest.
- Create tables with a designated timestamp column — it is what makes time-series queries fast.
- Partition by day or month for anything long-lived; an unpartitioned table cannot drop old data cheaply.
CREATE TABLE trades (
timestamp TIMESTAMP,
symbol SYMBOL,
price DOUBLE,
size DOUBLE
) TIMESTAMP(timestamp) PARTITION BY DAY;
Connect from AddisDB
- New Connection → QuestDB under Timeseries. Port prefills to 8812 and the username to admin.
- Enter the host and password. Database prefills to qdb.
- For QuestDB Cloud, set SSL mode to require.
- Test, then Save.
Port 9000 serves the web console and the REST ingestion API, not the Postgres wire protocol. Pointing a connection there fails at the handshake.
The three extensions worth learning
-- Downsample to one row per minute
SELECT timestamp, avg(price) AS avg_price
FROM trades
WHERE symbol = 'BTC-USD'
SAMPLE BY 1m;
-- Latest price per symbol, without a window function
SELECT * FROM trades
LATEST ON timestamp PARTITION BY symbol;
-- Align two series that were not sampled together
SELECT t.timestamp, t.price, q.bid, q.ask
FROM trades t
ASOF JOIN quotes q ON (symbol);
ASOF JOIN is the one that removes the most application code: it matches each row with the most recent row from the other table at or before its timestamp, which is the join every market-data pipeline hand-rolls otherwise.
What AddisDB gives you
- The Chart view — a result with a timestamp column renders as a time-series chart straight away.
- Schema introspection with the table list and ⌘K search across every connected database.
- Mock data generated from your real schema.
- Full safety: read-only connections, prod tagging, destructive-statement detection.
- AI querying grounded in your real tables.