Skip to content

When to Use RockLake

Every tool has a sweet spot — a set of conditions where it outperforms alternatives and a set of conditions where it falls short. RockLake's sweet spot is precisely defined by its architecture: single-writer, object-storage-backed, bounded-SQL, serverless. This page provides specific, actionable criteria for evaluating whether RockLake is right for your workload. It includes both the scenarios where RockLake excels (and you should strongly consider it) and the scenarios where it is a poor fit (and you should look elsewhere).

The goal is to save you time. If your workload matches the "RockLake excels" criteria, you can adopt it with confidence that it will serve you well. If your workload matches the "RockLake is not ideal" criteria, you now know before investing deployment effort.

RockLake Excels When

You Want a Serverless Data Lakehouse Catalog

This is RockLake's primary use case — the scenario it was designed for from the first line of code.

The situation: Your data lives in object storage (S3, GCS, Azure Blob) as Parquet files. You want to query it with DuckDB as a proper lakehouse (schema management, time travel, file-level statistics). You do not want to run a database server for the catalog.

Why RockLake excels:

  • One binary + one bucket path = complete DuckLake catalog
  • No database server to manage (no PostgreSQL, no MySQL)
  • Catalog metadata lives alongside your data in object storage
  • Durability is inherited from the cloud provider (11 nines for S3)
  • Start and stop at will — no persistent server process required
  • Pay only for storage and API calls — no instance hours when idle

The alternative (PostgreSQL) requires: An always-running database instance ($50+/month minimum), backup procedures, patching, connection management, failover configuration, and monitoring. For teams that just want to query Parquet files, this is over-engineering.

Decision threshold: If "running a database server" is a meaningful operational burden for your team (small team, no dedicated DBA, infrastructure-light philosophy), RockLake removes that burden entirely.

You Are Building on DuckDB

RockLake is designed specifically for DuckDB's ducklake extension. The integration is native, the protocol is fully supported, and the deployment model aligns with DuckDB's philosophy (simple, embedded, minimal dependencies).

Why RockLake excels for DuckDB users:

  • DuckDB + RockLake gives you a complete lakehouse with two components (no third-party coordination services)
  • The native extension (Strategy C) embeds RockLake directly in DuckDB — zero network overhead, single-process deployment
  • RockLake's SQL dialect matches DuckLake's protocol exactly (no compatibility layer, no translation)
  • Both DuckDB and RockLake share the "do one thing well" philosophy — they compose cleanly

When this matters less: If DuckDB is not your primary query engine (you use Spark, Trino, or Presto), RockLake provides less value because those engines do not speak the DuckLake protocol natively. You would need a compatibility layer, which reduces the simplicity advantage.

Your Catalog Workload Is Moderate

A "moderate" catalog workload for DuckLake means:

Dimension Moderate Range RockLake Handles Comfortably
Tables 10–1,000 Yes
Columns per table 5–200 Yes
Data files 100–1,000,000 Yes
Reads per minute 10–10,000 Yes (cache serves most)
Writes per minute 0.1–100 Yes (single writer sufficient)
Concurrent readers 1–100 Yes (unlimited readers)
Schema changes A few per day Yes

The vast majority of analytics workloads fall within these ranges. A data warehouse with 500 tables, 50,000 columns, and 10 ETL jobs writing every 15 minutes is well within RockLake's capacity. The catalog sees maybe 10–20 writes per hour and a few thousand reads.

Decision threshold: If your catalog sees fewer than 100 writes per minute and fewer than 10,000 reads per minute, RockLake's throughput is not a bottleneck.

You Need Reliable Time Travel

RockLake's immutable architecture provides time travel as an inherent property, not as an add-on feature:

  • Every mutation creates a new snapshot with a monotonically increasing ID
  • Previous snapshots are never modified (only superseded)
  • Query any historical snapshot by ID: "show me the catalog state as of snapshot 500"
  • Time travel works across schema changes, file registrations, and drops
  • Historical data persists until explicitly garbage collected

Why this matters:

  • Pipeline debugging: "The dashboard broke yesterday. What did the catalog look like at 2pm?" — query snapshot 450 and compare to current.
  • Audit requirements: "Show the state of all tables at end-of-quarter." — use the snapshot from that date.
  • Reproducibility: "Re-run last Thursday's analysis with the same data." — attach the catalog at Thursday's snapshot.

The alternative with PostgreSQL: Temporal tables or trigger-based audit logs can provide similar functionality, but they require engineering effort (designing the triggers, managing the audit table growth, querying historical state). RockLake provides this out of the box.

You Operate in Multiple Regions

RockLake leverages cloud provider infrastructure for multi-region access without application-level replication:

Cross-Region Read Access:

us-east-1: RockLake writer → s3://bucket/catalog/
eu-west-1: RockLake reader → s3://bucket/catalog/ (S3 Cross-Region Replication)
ap-southeast-1: RockLake reader → s3://bucket/catalog/ (S3 CRR)

S3's Cross-Region Replication makes catalog data available globally with infrastructure-level configuration (no application changes). Readers in remote regions access replicated data with local latency.

The alternative with PostgreSQL: Cross-region read replicas require configuration (streaming replication, connection routing), introduce replication lag (seconds to minutes), and add operational complexity (monitoring lag, handling failover). RockLake delegates all of this to the storage provider.

You Want Zero-Ops Durability

RockLake's durability is inherited from object storage:

Provider Durability SLA Availability SLA Backup Required?
S3 Standard 99.999999999% (11 nines) 99.99% No
GCS Standard 99.999999999% 99.95% No
Azure Blob (GRS) 99.99999999999999% (16 nines) 99.99% No

For comparison, a self-managed PostgreSQL deployment achieves high durability only through careful WAL archiving, point-in-time recovery testing, and backup verification. Most teams do not achieve 11 nines of durability for their PostgreSQL instances — they achieve whatever their backup strategy provides (typically 99.99% — four nines — which means potential data loss during failures).

Decision threshold: If "we lost the catalog" is unacceptable and you do not want to invest in backup verification, RockLake provides durability without engineering effort.

RockLake Is Not Ideal When

You Need Sub-Millisecond Catalog Latency

If your use case requires that catalog operations complete in under 1ms — consistently, including cold starts — RockLake on S3 Standard cannot provide this. Cold reads take 30–100ms. Even with S3 Express (3–10ms cold), you cannot reach sub-millisecond territory.

Scenarios where this matters:

  • Interactive BI dashboards with 100ms total query budget (catalog lookup must be < 5ms)
  • Real-time applications that issue many small queries with strict latency SLAs
  • Benchmarking environments where every millisecond is measured

What to use instead:

  • SQLite for single-machine deployments (sub-0.1ms, in-process)
  • PostgreSQL with warm buffer pool for multi-machine (1–3ms, stable)
  • RockLake native extension brings latency to 0.3ms for cache-hot reads (but cold reads still hit object storage)

Mitigation if you still want RockLake: Use S3 Express One Zone (3–10ms cold, < 1ms warm after cache hits) and ensure your working set fits in cache. After warm-up, most reads are under 2ms. But if you need guaranteed sub-millisecond — including the first read after a restart — RockLake cannot provide that.

You Have Extreme Write Throughput

If your pipeline registers more than 100 files per second continuously (not in bursts — continuously), RockLake's single-writer model on S3 Standard is a bottleneck:

  • S3 Standard: ~10–15 writes/second (sequential)
  • At 100 files/batch: ~1,000–1,500 file registrations/second
  • At 1,000 files/batch: ~7,000–10,000 file registrations/second

If your requirement exceeds these numbers:

What to use instead:

  • PostgreSQL with concurrent transactions: 5,000–20,000 individual writes/second
  • Multiple RockLake catalogs (one per dataset): each handles independent writes in parallel

Mitigation if you still want RockLake: Batch more aggressively. If your pipeline can buffer 10,000 file registrations and commit them in one transaction every 10 seconds, RockLake handles this easily (one write per 10 seconds). The constraint is not throughput per batch — it is transactions per second.

You Need Arbitrary Catalog Queries

RockLake's bounded SQL means it only supports the ~50 statement patterns that DuckLake needs. You cannot run arbitrary analytical queries against catalog metadata:

-- These work in PostgreSQL but NOT in RockLake:
SELECT table_name, count(*) as file_count
FROM ducklake_tables t JOIN ducklake_data_files f ON t.table_id = f.table_id
GROUP BY table_name
ORDER BY file_count DESC;

SELECT * FROM ducklake_columns WHERE data_type LIKE '%timestamp%';

SELECT schema_name, count(DISTINCT table_id) FROM ducklake_tables GROUP BY schema_name;

If you regularly need to query catalog metadata for analytics (data governance dashboards, catalog health reports, metadata search), RockLake requires an export-then-query workflow:

# Export to NDJSON
rocklake export --catalog s3://bucket/catalog/ --output catalog.ndjson

# Then query with DuckDB
duckdb -c "SELECT * FROM read_ndjson('catalog.ndjson') WHERE ..."

What to use instead: PostgreSQL allows full SQL against DuckLake's catalog tables. If ad-hoc catalog queries are a frequent need (daily or more), PostgreSQL provides a significantly better experience.

You Already Operate Managed PostgreSQL

If your organization already runs managed PostgreSQL (RDS, Cloud SQL, Azure Database) with:

  • Established backup procedures
  • Monitoring dashboards
  • Incident runbooks
  • Team expertise

Then the operational advantage of RockLake is small. Adding one more database to a fleet of databases you already manage is trivial. The marginal operational cost of "one more PostgreSQL database" is near zero for a team that already operates PostgreSQL.

Decision threshold: If adding a PostgreSQL database to your infrastructure takes less than 30 minutes of one-time setup and zero ongoing effort (because all the operational practices already exist), RockLake's simplicity advantage is negligible.

You Need True Multi-Writer

If multiple independent processes must write to the same catalog concurrently without coordination (and dataset partitioning is not acceptable), RockLake's single-writer model is a fundamental limitation.

Scenarios where this matters:

  • Multiple ETL pipelines writing to the same tables simultaneously
  • Collaborative environments where multiple users modify schema concurrently
  • Event-driven architectures where catalog writes come from many independent sources

What to use instead: PostgreSQL with row-level locking handles concurrent writes natively. DuckLake's PostgreSQL backend supports multiple concurrent connections writing to the same catalog.

Mitigation if you still want RockLake: Dataset partitioning (one catalog per dataset, one writer per catalog) provides write parallelism across datasets. If your concurrent writes are to different datasets, this pattern eliminates the constraint with no loss of functionality.

Workload Decision Matrix

Criterion Favors RockLake Favors PostgreSQL Favors SQLite
Team size Small (no DBA) Any One developer
Write frequency < 100/min > 100/min Any
Read latency need > 5ms OK < 5ms required < 0.1ms required
Durability need Maximum (11 nines) Managed is OK Not critical
Infrastructure Object storage only Database fleet exists Single machine
Time travel Required Nice to have Not needed
Ad-hoc catalog SQL Not needed Frequently needed Occasionally
Budget Minimal Moderate Zero
Multi-region reads Required Optional Not applicable
Machine count Multiple Multiple One

Scoring: Count the column with the most matches. That is likely your best choice.

Hybrid Approaches

You do not have to choose one backend for all use cases:

  • Development: SQLite (zero setup, instant)
  • Staging: RockLake (matches production architecture)
  • Production: RockLake or PostgreSQL (depending on your team's profile)

DuckDB's ducklake extension works identically against all backends. Your SQL queries, data files, and application code do not change when switching backends. Only the connection string changes.

Further Reading