SET options.
Two 0.16.0 features have their own dedicated config reference: Segment Groups (
segmentGroupConfig and cluster-level grouping gates) and Deletion Vectors (enableDeletionVectors and the readiness/pruning config below).Best practices
Onboarding- Enter the bucket name only (no
s3://) and set the AWS region in the connection config — a region in config means you don’t depend on theAWS_REGIONenvironment variable. - Grant the cluster access to the source bucket with an assumed IAM role (
roleArn+ optionalexternalId) or the cluster’s node role; verify withaws s3 ls s3://<bucket>/<prefix>/before onboarding. - For very large sources, start with a smaller prefix subset and scale the cluster before onboarding the full dataset.
- Set
continueOnFileError=trueif a sync run should skip an unreadable file instead of failing the whole run (default is to fail).
- Keep the data types the preview step infers; overriding them can break segment generation.
- Set a time column where the data has one — it enables time-based segment pruning and retention. Recommended but not mandatory; tables without a time column still work.
- Add indexes for the columns you filter and group by — without them, queries scan remote data.
- For dictionary-backed indexes (inverted, FST, IFST), keep the forward index
RAWand add an explicitdictionaryblock. - Avoid grouping by derived/computed columns — it defeats segment pruning.
- Enable the page cache (
enable.prefetch.page.cache) andpreload.enableso index data is served locally — see Caching and index pinning. - Pin small, hot indexes (bloom filter, dictionary) with
preload.index.keys.override; let the index cache serve the larger/colder ones. - Turn on index consolidation to collapse a segment’s per-column index files into one mmap, avoiding the OS
max_map_countlimit on wide tables — see Caching and index pinning. - Enable pre-warm (
pinot.parquet.prewarm.enabled) to pay the cache-fill cost at segment load instead of on the first query.
- For tables that get heavy scans or aggregations, enable the query OOM killer so a single runaway query is killed instead of crashing the server — see Query OOM protection.
- Optionally enable the pre-kill pause so the server briefly pauses to let GC reclaim memory before killing — this can save a query that would otherwise be killed.
- Let the controller watcher schedule syncs; monitor health with the observability endpoints.
Caching and index pinning
External Table queries read indexes from remote storage, so keeping index data local is what makes them fast. There are two ways to do that — pinning and the index cache — and they’re used together.
Pin the small, always-needed indexes; let the cache handle the rest. Pinning is resident memory, so reserve it for compact indexes you hit on most queries — bloom filters, dictionaries, and small range/inverted indexes. Everything larger or colder (JSON, text, wide columns) should go through the index cache, which fetches on demand and evicts what isn’t used.
<column>.<indexKey> (or * for all columns), where indexKey is the index’s file key — e.g. inverted_index, range_index, bloom_filter, or dictionary. Examples: payment_type.inverted_index, *.bloom_filter, *.dictionary.
Index consolidation. On a wide table, each column’s index is a separate memory-mapped file, and many segments × many columns can exhaust the OS memory-map limit (max_map_count) — surfacing as native-memory / mmap allocation failures and server restarts. Set preload.enable.index.consolidation=true to pack a segment’s index regions into a single file per segment, drastically cutting the mmap count. Onboarding enables this by default.
Where configs live
Server and cluster keys resolve in the order cluster config (Helix) → JVM
-D property → built-in default. Prefer cluster config so values can change without a restart.Table config — ExternalTableSyncTask
Catalog & mode
Connection keys
The catalog connection keys are prefixedcatalog.s3.* or catalog.iceberg-rest.* (REST URI, service type — glue, s3Tables, unity, or rest (Nessie and other generic Iceberg REST catalogs) — warehouse/prefix, namespace/table, and auth.rest.* / auth.storage.* credentials). The full list with examples is in AWS Glue: Onboarding via API, Unity Catalog: Onboarding via API for Unity-specific auth, or Nessie: Onboarding via API for the generic rest adapter.
Scheduling & task sizing
Snapshot processing (Iceberg)
Checkpointing & schema evolution
How schema evolution resolves changes (0.16.0+). When
schemaEvolution.enabled=true on a catalogType=iceberg-rest source, each sync unions the current schema against the source’s Iceberg field-id/alias history instead of matching by column name alone. This means a source column rename is tracked as an alias rather than dropping and re-adding a column — the existing Pinot column name is preserved. Two limitations: resolution only covers top-level fields (nested-field renames aren’t resolved), and a detected type widening is rejected rather than silently applied — set schemaEvolution.failFast=true if you want such a rejection to abort the run instead of being logged and skipped.Tier backend properties (caching & preload)
Set on the S3 tier intierConfigs[].tierBackendProperties. The onboarding/preview flow sets sensible defaults.
Common
¹ Defaults to
true for tables scaffolded through the onboarding API.
Preload tuning
The S3 tier also exposes advanced on-demand buffer, mmap, and read-ahead sub-properties (
ondemand.*, mmap.*, readAhead.*). These are internal tuning knobs — leave them at defaults unless StarTree support advises otherwise.Server / cluster configs
Parquet page cache sizing
Pre-warm at segment load
Page reader & prefetch
Prefetch depth is bounded by the query option
prefetch.projection.queue.size (default 10) — how many projection blocks are fetched ahead when the scan queue refills. The other prefetch-related knobs are the prefetch buffer size (...prefetch.size.mb), the look-ahead in-flight cap (...segment.lookahead.max.inflight.chunks), the in-flight chunk-read cap (...max.in.flight.chunk.reads), and the page-reader pool size (...pagereader.pool.size).Segment data cache (footer & index headers)
Index reader
Query OOM protection (large scans)
A query that scans a large amount of remote data can grow the server heap until the process OOMs. Server-side per-query memory accounting protects against this: when heap usage crosses a threshold, the most memory-hungry query is killed (or briefly paused first) instead of the whole server crashing. Recommended for tables that get heavy scans or aggregations.Query options
Set per query withSET "key" = 'value'. Several of these are also tier or server configs — setting them as a query option overrides the config for that one query.
Example — bypass the cache for one query:

