Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions documentation/guides/schema-design-essentials.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
---
title: Data Modeling Basics
sidebar_label: Data Modeling Basics
slug: data-modeling-basics
title: Schema design
sidebar_label: Schema design
description:
Learn how to design efficient schemas in QuestDB. Covers timestamps,
partitioning, data types, deduplication, and retention strategies.
Expand Down
16 changes: 10 additions & 6 deletions documentation/introduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,15 @@ import { Resources } from "../src/components/Resources"
import { HeroPattern } from "../src/components/HeroPattern"
import { DocButton } from "../src/components/DocButton"

QuestDB is a high-performance time-series database optimized for fast ingestion
and SQL analytics.
QuestDB is a high-performance time-series database built for speed:

It handles millions of rows per second with sub-millisecond queries, making it
ideal for financial data, IoT, and real-time analytics.
- **Low-latency architecture** — sub-millisecond queries on billions of rows
- **High-throughput ingestion** — millions of rows per second
- **Fast SQL with time-series extensions** — SAMPLE BY, LATEST ON, ASOF JOIN
- **Open formats** — built on Parquet, no vendor lock-in
- **AI-ready** — query with LLMs or use BYOK AI in the Web Console

Used in capital markets, fintech, crypto, energy, heavy industry, space exploration, and robotics.

<div className="not-prose mb-16 mt-6 flex gap-3">
<DocButton href="/quick-start" arrow="right" style={{ marginRight: '20px' }}>
Expand All @@ -40,8 +44,8 @@ RBAC.
## Get started

1. **[Quick start](/docs/quick-start/)** - Install and run QuestDB
2. **[Data Modeling Basics](/docs/data-modeling-basics/)** - Design your tables
3. **[Ingest data](/docs/ingestion-overview/)** - Bring your data using ILP clients
2. **[Schema design](/docs/guides/schema-design-essentials/)** - Design your tables
3. **[Ingest data](/docs/ingestion-overview/)** - Bring your data using QuestDB clients
4. **[Query data](/docs/reference/sql/overview/)** - Analyze with SQL

<div className="not-prose">
Expand Down
2 changes: 1 addition & 1 deletion documentation/operations/profiling.md
Original file line number Diff line number Diff line change
Expand Up @@ -317,4 +317,4 @@ If profiling causes noticeable performance impact:

- [Logging and metrics](/docs/operations/logging-metrics/) - Configure logging and Prometheus metrics
- [Monitoring and alerting](/docs/operations/monitoring-alerting/) - Set up health checks and alerts
- [Schema design essentials](/docs/guides/schema-design-essentials/) - Schema and performance guidelines
- [Schema design](/docs/guides/schema-design-essentials/) - Schema and performance guidelines
128 changes: 62 additions & 66 deletions documentation/pgwire/pgwire-intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: PostgreSQL Wire Protocol
description:
QuestDB supports the PostgreSQL wire protocol (PGWire), allowing you to connect
using standard PostgreSQL client libraries for querying and data ingestion.
using standard PostgreSQL client libraries for querying data.
---

import { Clients } from "../../src/components/Clients"
Expand All @@ -16,21 +16,17 @@ import GoInsertPartial from "../partials/_go.sql.insert.partial.mdx"
import RustInsertPartial from "../partials/_rust.sql.insert.partial.mdx"

QuestDB implements the PostgreSQL wire protocol (PGWire), allowing you to
connect using standard PostgreSQL client libraries. This is a great way to get
started with QuestDB, as you can use existing PostgreSQL clients and tools.
connect using standard PostgreSQL client libraries. This is the recommended way
to **query data** from QuestDB, as you can use existing PostgreSQL clients and
tools.

<Clients showProtocol="PGWire" />

## Querying vs. ingestion
PGWire also supports [INSERT statements](#insert-examples) for lower-volume data
ingestion. For high-throughput ingestion, use the
[QuestDB clients](/docs/ingestion-overview/) instead.

The PGWire interface is recommended for **querying data** from QuestDB.
## Query examples

For **data ingestion**, especially high-throughput scenarios, we recommend using
the [InfluxDB Line Protocol (ILP)](/docs/ingestion-overview/) clients instead.
ILP is optimized for fast data insertion and provides better performance.

That said, PGWire does support INSERT statements for lower-volume ingestion use
cases.
<Clients showProtocol="PGWire" />

## Compatibility

Expand Down Expand Up @@ -60,45 +56,6 @@ cases.
| `password` | quest | Password from `pg.password` or `pg.readonly.password` property in `server.conf`. Default: `quest` |
| `options` | -c statement_timeout=60000 | The only supported option is `statement_timeout`, which specifies maximum execution time in milliseconds for SELECT or UPDATE statements. |

## Ingest examples

<Tabs defaultValue="python" values={[
{ label: "psql", value: "psql" },
{ label: "Python", value: "python" },
{ label: "Java", value: "java" },
{ label: "NodeJS", value: "nodejs" },
{ label: "Go", value: "go" },
{ label: "Rust", value: "rust" },
]}>

<TabItem value="psql">
<PsqlInsertPartial />
</TabItem>

<TabItem value="python">
<PythonInsertPartial />
</TabItem>

<TabItem value="java">
<JavaInsertPartial />
</TabItem>

<TabItem value="nodejs">
<NodeInsertPartial />
</TabItem>

<TabItem value="go">
<GoInsertPartial />
</TabItem>

<TabItem value="rust">
<RustInsertPartial />
</TabItem>

</Tabs>

For query examples, see the [Query & SQL Overview](/docs/reference/sql/overview/#postgresql).

## Important considerations

### Timestamp handling
Expand Down Expand Up @@ -153,6 +110,59 @@ your client library allows:

The specifics of how to configure this will vary by client library.

## Highly-available reads (Enterprise)

QuestDB Enterprise supports running
[multiple replicas](/docs/operations/replication/) to serve queries. Many client
libraries allow specifying **multiple hosts** in the connection string. This
ensures that initial connections succeed even if a node is unavailable. If the
connected node fails later, the application should catch the error, reconnect to
another host, and retry the read.

For background and code samples in multiple languages, see:

- Blog: [Highly-available reads with QuestDB](https://questdb.com/blog/highly-available-reads-with-questdb/)
- Examples: [questdb/questdb-ha-reads](https://github.com/questdb/questdb-ha-reads)

## INSERT examples

PGWire supports INSERT statements for lower-volume ingestion use cases.

<Tabs defaultValue="python" values={[
{ label: "psql", value: "psql" },
{ label: "Python", value: "python" },
{ label: "Java", value: "java" },
{ label: "NodeJS", value: "nodejs" },
{ label: "Go", value: "go" },
{ label: "Rust", value: "rust" },
]}>

<TabItem value="psql">
<PsqlInsertPartial />
</TabItem>

<TabItem value="python">
<PythonInsertPartial />
</TabItem>

<TabItem value="java">
<JavaInsertPartial />
</TabItem>

<TabItem value="nodejs">
<NodeInsertPartial />
</TabItem>

<TabItem value="go">
<GoInsertPartial />
</TabItem>

<TabItem value="rust">
<RustInsertPartial />
</TabItem>

</Tabs>

### Decimal values

To insert `decimal` values via PGWire, you must either use the `m` suffix to
Expand All @@ -168,17 +178,3 @@ Currently, QuestDB parses these strings as `double` values and doesn't
implicitly convert them to `decimal` to avoid unintended precision loss. You
must explicitly cast `double` values to `decimal` in your SQL queries when
inserting into `decimal` columns.

## Highly-available reads (Enterprise)

QuestDB Enterprise supports running
[multiple replicas](/docs/operations/replication/) to serve queries. Many client
libraries allow specifying **multiple hosts** in the connection string. This
ensures that initial connections succeed even if a node is unavailable. If the
connected node fails later, the application should catch the error, reconnect to
another host, and retry the read.

For background and code samples in multiple languages, see:

- Blog: [Highly-available reads with QuestDB](https://questdb.com/blog/highly-available-reads-with-questdb/)
- Examples: [questdb/questdb-ha-reads](https://github.com/questdb/questdb-ha-reads)
2 changes: 1 addition & 1 deletion documentation/quick-start.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ see:
configurations for operating QuestDB in production**
- [Configuration](/docs/configuration/) to see all of the available options in
your `server.conf` file
- [Schema design essentials](/docs/guides/schema-design-essentials/) for tips
- [Schema design](/docs/guides/schema-design-essentials/) for tips
and tricks
- [Visualize with Grafana](/docs/third-party-tools/grafana/) to create useful
dashboards and visualizations from your data
Expand Down
5 changes: 2 additions & 3 deletions documentation/reference/sql/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,8 @@ series data an intuitive and flexible experience.
Queries can be written into many applications using existing drivers and clients
of the PostgreSQL or REST-ful ecosystems. However, querying is also leveraged
heavily by third-party tools to provide visualizations, such as within
[Grafana](/docs/third-party-tools/grafana/), or for connectivity into broad data
infrastructure and application environments such as with a tool like
[Cube](/docs/third-party-tools/cube/).
[Grafana](/docs/third-party-tools/grafana/), or for data analysis with dataframe
libraries like [Polars](/docs/third-party-tools/polars/).

> Need to ingest data first? Checkout our
> [Ingestion overview](/docs/ingestion-overview/).
Expand Down
58 changes: 40 additions & 18 deletions documentation/sidebars.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,9 @@ module.exports = {
},
{
type: "category",
label: "InfluxDB Line Protocol (ILP)",
label: "Language Clients",
collapsed: true,
items: [
{
id: "reference/api/ilp/overview",
type: "doc",
label: "Overview",
},
{
id: "configuration-string",
type: "doc",
Expand Down Expand Up @@ -108,17 +103,7 @@ module.exports = {
{
id: "clients/date-to-timestamp-conversion",
type: "doc",
label: "Date to Timestamp Conversion",
},
{
id: "reference/api/ilp/columnset-types",
type: "doc",
label: "Columnset Types",
},
{
id: "reference/api/ilp/advanced-settings",
type: "doc",
label: "Advanced Settings",
label: "Date to Timestamp",
},
],
},
Expand All @@ -133,7 +118,44 @@ module.exports = {
"third-party-tools/flink",
],
},
"reference/api/java-embedded",
{
type: "category",
label: "Protocols",
collapsed: true,
items: [
{
type: "category",
label: "InfluxDB Line Protocol (ILP)",
items: [
{
id: "reference/api/ilp/overview",
type: "doc",
label: "Overview",
},
{
id: "reference/api/ilp/columnset-types",
type: "doc",
label: "Columnset Types",
},
{
id: "reference/api/ilp/advanced-settings",
type: "doc",
label: "Advanced Settings",
},
],
},
{
id: "reference/api/rest",
type: "doc",
label: "REST HTTP API",
},
{
id: "reference/api/java-embedded",
type: "doc",
label: "Java Embedded",
},
],
},
],
},

Expand Down
21 changes: 12 additions & 9 deletions documentation/why-questdb.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,29 @@ description:
import { Clients } from '../src/components/Clients'
import Screenshot from "@theme/Screenshot"

QuestDB is a high-performance time-series database built for speed and efficiency.
QuestDB is an open source time-series database with a multi-tier storage engine for scale and low-latency analytics for the most demanding time-series workloads. It is built on open formats such as Parquet to avoid vendor lock-in.

> **Ready to try it? Jump to the [quick start](/docs/quick-start/).**

## When to use QuestDB

QuestDB is designed for workloads where:
QuestDB is designed for workloads that require:

- **You're ingesting time-stamped data continuously** — sensor readings, financial ticks, application metrics, logs, events
- **You need fast aggregations over time** — dashboards, real-time analytics, OHLC charts, downsampling
- **You want SQL, not a new query language** — standard SQL with time-series extensions
- **Hardware efficiency matters** — get more from less infrastructure
- **Continuous ingestion of time-stamped data** — financial tick data, sensor readings, events
- **Fast time-based queries** — dashboards, real-time analytics, downsampling, high QPS
- **Efficient petabyte-scale storage** — [multi-tier architecture](/docs/guides/architecture/questdb-architecture/) with long-term storage in Parquet files
- **SQL, not a new query language** — standard SQL with time-series extensions
- **Hardware efficiency** — get more from less infrastructure
- **Capital markets and crypto capabilities** — [N-dimensional arrays](/docs/concept/array/), [order book analytics](/docs/guides/order-book/), [OHLC charts](https://questdb.com/blog/kline-candlestick-charts-with-grafana-and-questdb/), advanced post-trade analysis, ultra-low latency architecture, and a [strong customer base](https://questdb.com/customers/) in financial services

### Common use cases

| Domain | Examples |
|--------|----------|
| **Financial services** | Market data, tick-by-tick analysis, risk calculations |
| **Space exploration** | Telemetry processing, satellite monitoring, mission analytics |
| **Energy** | Grid monitoring, smart meter data, renewable output tracking |
| **Capital markets** | Market data, tick-by-tick analysis, pre and post trade analytics |
| **Banking** | Retail banking analytics, fraud detection, transaction monitoring |
| **Aerospace** | Flight telemetry, satellite monitoring, rocket engine simulations |
| **Energy** | Grid monitoring, anomaly detection, power generation forecasting |

## What makes QuestDB fast

Expand Down
Loading