Files
lancedb/docs/web/enterprise/incremental-refresh.mdx
T
Jack YeandClaude Sonnet 5 de95ed3f6d docs: overhaul curation, feature engineering, security and deployment guides (#4748)
A broad documentation pass across the areas LanceDB Enterprise and
Embedded
diverge on most:

**Data Curation** -- GPU Function execution, Slurm scheduling (and what
Slurm is, for readers new to it), blob late materialization as its own
page, joins, aggregation/profiling, sampling, near-duplicate detection,
chunking, distributed shuffle, and IVF-partition clustering.

**Feature Engineering** -- computed columns and materialized views,
restructured to lead with the Function-based path and show the SQL form
side by side with Python throughout; a single Auto Refresh page instead
of
duplicating scheduling details on every refresh page; adaptive
execution;
checkpointing; GPU and Slurm placement for refresh workers; a Training
Cache page for the PyTorch data loader's automatic cache benefit.

**Security & Governance** -- an Audit Log reference (schema, access,
grants), Secrets promoted to an ordinary catalog object with their own
SQL
DDL and a vending/rotation guide, and privilege-table fixes verified
against the authorization source.

**Deployment & Maintenance** -- Horizontal Scaling and OpenTelemetry
moved
into a real Deployment area; Automated Cleanup folded into Intelligent
Auto-Maintenance (every other maintenance decision already lived there);
RTE Compaction and Advanced Conflict Resolution documented in depth.

**Landing page** -- the Enterprise feature comparison table reorganized
(several redundant or stale rows removed, several new areas added), and
the
"why Enterprise" bullets replaced with ones tied to a concrete page
(Performance, Scale, Fault tolerance, Multicloud deployment, Simplify
operations) instead of vague promises.

Plus a full pass addressing lancedb-gatekeeper's review: a real
test-safety
bug (a quickstart test could silently overwrite and delete a
deployment's
own `frames` table), a fabricated SQL statement with no backing
implementation, an actual dedup-guarantee bug in `take_row_ids`, and
dozens
of documentation-accuracy fixes verified against source rather than
taken
on faith -- each either fixed, or left with an explicit note on why it
needs a feature or deployment owner's sign-off instead of being guessed
at.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_018PXMCbRH6i5w47TsjeEUMT

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-11-03 16:17:24 -08:00

52 lines
2.3 KiB
Plaintext

---
title: "Incremental Refresh"
sidebarTitle: "Incremental Refresh"
description: "Why refreshing a computed column only recomputes fragments that hold a row whose inputs actually changed."
icon: "arrow-rotate-right"
availability:
embedded: unavailable
enterprise: available
---
Refreshing a [computed column](/feature-engineering/add-computed-column)
is incremental: it fills rows that have no value yet and recomputes the
fragments that hold a row whose input changed since it was last computed,
leaving every other fragment alone. A second refresh with nothing changed
does nothing. The
planner finds the rows that actually need work by checking which
fragments still carry stale or empty values for the column, then groups
them into claimable units a fleet of job workers can pick up in parallel
-- see [Architecture](/index#architecture).
<Note>
A **materialized view** doesn't track stale rows the way a computed
column does -- there's no smaller unit than the whole view to recompute
from a saved query. In LanceDB Embedded, every refresh rebuilds the view
completely with no incremental step; LanceDB Enterprise's server chooses
the refresh mode instead, unless the caller forces a full rebuild. See
[Refresh a materialized view](/feature-engineering/refresh-materialized-view).
</Note>
## Why this matters {#why}
Appending rows is cheap: the next refresh only fills what's new, not what
it already computed. Updating an input row is also cheap in the same
way -- the derived column keeps its old value until the next refresh
notices the input changed. Staleness is tracked per fragment, not per
row: the refresh recomputes every row in a fragment where at least one
input moved, which can re-evaluate rows whose own value didn't actually
need it, not strictly only the row that changed. Nothing is recomputed
between refreshes, so a derived column can be stale right up until you
call for one.
## What to read next {#next}
<CardGroup cols={2}>
<Card title="Refresh a computed column" icon="arrows-rotate" href="/feature-engineering/refresh-column#idempotent">
The exact fill/recompute/leave-alone rules, with examples.
</Card>
<Card title="Adaptive Execution" icon="gauge-high" href="/enterprise/adaptive-execution">
How the units this planner produces get sized and run.
</Card>
</CardGroup>