How it works
- Server-side loading — each server decodes the Iceberg Puffin deletion files relevant to its segments and applies them when answering a query, so deleted/updated rows are excluded from results.
- Atomic snapshot readiness — before a new Iceberg snapshot becomes visible to queries, the controller polls every server until all of them confirm they’ve loaded the deletion vectors for that snapshot. This avoids a window where some servers see the new snapshot’s deletes and others don’t.
- Broker-side pinning and consistency — queries pin an explicit snapshot per table so all servers involved in a query agree on which snapshot (and therefore which deletes) to use. An invalid or not-yet-ready pinned snapshot fails the query rather than silently mixing snapshot state.
Enabling deletion vectors
Set on the table’sExternalTableSyncTask config:
Controller: snapshot readiness
The controller also exposes a readiness endpoint:
{"ready": true|false}. Returns 412 if the table has not initialized a deletion-vector manager (i.e. enableDeletionVectors=false).
Broker: pruning and pinning
Broker-side deletion-vector pruning only activates for OFFLINE tables with
enableDeletionVectors=true — it is a zero-cost no-op otherwise.
Query-time snapshot pinning
Deletion-vector-enabled tables require an explicit pinned snapshot per query, set with thesnapshotVersionByTable query option (this replaces the older single-table snapshotVersion option):
QUERY_EXECUTION error rather than returning results computed from a mix of snapshot states.
Storage format
The deletion-vector index itself is stored as a sorted, dictionary-encoded, bloom-filtered Parquet file (dv-index.parquet) rather than JSON — cutting heap usage for large delete sets by roughly an order of magnitude compared to the original JSON-based format. There is no backward-compatibility bridge from the old JSON format; this applies to newly-synced deletion vector state.
Observability
The run-status endpoint’s
failurePhase field (see Observability) can also report IS_EV_CONVERGENCE or SNAPSHOT_READINESS_POLL when a sync run fails during deletion-vector convergence.
FAQs
Do I need to set snapshotVersionByTable on every query once deletion vectors are enabled?
Yes — it’s required for deletion-vector-enabled tables. Without it, or with an invalid/not-yet-ready snapshot, the query fails rather than returning potentially inconsistent results.
What happens to existing (JSON-format) deletion-vector state after upgrading?
There is no automatic migration from the JSON format. This feature targets newly-synced deletion vector state — check with StarTree support before relying on it against a table with pre-existing deletion-vector data.Does this work for raw S3 Parquet (non-Iceberg) External Tables?
No — deletion vectors are an Iceberg-specific capability (deletionVectorSource=iceberg), tied to Iceberg’s Puffin delete-file format.
