Query execution across ClickHouse and Lance
The query coordinator in the customer cloud plans each SQL statement with DataFusion. Public facts come from ClickHouse in Boundary. Private columns come from Lance datasets in the customer bucket, read through a cache on local NVMe.
ClickHouse in Boundary: public facts
Execution and call identifiers, fqn, revision_id, status, started_at, duration_ns, the stream and data segment that hold each call, and availability states such as args_state. Public-only queries end here.
ClickHouse never holds value bodies, previews, source text or query literals that apply to private values.
Lance in the customer bucket: private columns
args, output, error, typed derived fields such as args['invoice']['id'] and an n-gram text index. They live as rebuildable Lance datasets in customer S3.
DataFusion in the coordinator reads them through a Foyer cache on local NVMe. Losing the cache changes latency, not results.
Inspect the DataFusion plan
The highlighted operator follows the current step. Read the logical plan from the scan at the bottom toward the result at the top.
Client result
Inspect source rows and Lance reads Changes with each step
Dimmed rows are outside the current selection. Struck-out columns are not scanned. Private columns are highlighted only when the coordinator reads them; they never leave the customer cloud.
ClickHouse public facts
Allowlisted facts projected into Boundary.
Lance private columns
Private rows in the customer bucket.
Takeaways
- Public queries never read private data. A public-only query runs entirely in ClickHouse and reads no Lance dataset.
- Private predicates, such as
args['invoice']['id'] = 'INV-1042', are evaluated in the customer cloud over Lance. The literal is never sent to Boundary. - Cache loss changes latency, not results. A cold read fetches Lance fragments from S3 into the NVMe cache; a warm read serves them from NVMe. Both return the same rows.
- Unavailable evidence is reported in the
queryOutcome. A call whoseargs_stateisnot_capturedis reported invalueEvaluations.unavailable, never treated as a non-match or silently dropped. An empty result is never produced by skipping unavailable evidence. - Public facts become visible in ClickHouse before their private rows are committed to Lance. The coordinator reports such rows as
private_state = pendingin theprivateStatecounts, never asNULLor a non-match. - A query binds one ClickHouse generation and one Lance version for its whole execution, and reports both in the
snapshotof the outcome.