Xoln opened a new issue, #8791:
URL: https://github.com/apache/paimon/issues/8791

   ### Search before asking
   
   - [x] I searched in the [issues](https://github.com/apache/paimon/issues) 
and found nothing similar.
   
   
   ### Motivation
   
   ```markdown
   ## Motivation
   
   The current primary-key vector index maintains one ANN segment per 
`(partition, bucket, level)`. When any file in a level changes due to 
compaction, the **entire level's segment must be fully rebuilt**, even if only 
a small subset of files was affected.
   
   For a level with 10 files totaling 10M rows, replacing just 2 files (2M 
rows) forces a rebuild of all 10M rows. This creates:
   - Excessive rebuild cost for DiskANN/HNSW (minutes for large levels)
   - Low `canAccept()` success rate when compact frequency > build time
   - Delayed index availability under `waitCompaction=false`
   
   ## Proposal
   
   Introduce a **Sub-Shard** mechanism that splits a level's index into 
finer-grained segments, so that only affected shards are rebuilt when 
compaction changes files.
   
   ### Three Granularity Options
   
   | Scope | Segment Covers | Rebuild Unit | Segments per Level (10 files) |
   |-------|---------------|--------------|-------------------------------|
   | **LEVEL** (current) | All files in level | Entire level | 1 |
   | **FILE_GROUP** | 2-4 adjacent files by key range | Affected group only | 
3-5 |
   | **PER_FILE** | Single compact-output file | Single file only | 10 |
   
   ### Example: 10 files, compact replaces 2
   
   | Metric | LEVEL (current) | FILE_GROUP | PER_FILE |
   |--------|----------------|-----------|---------|
   | Rebuild data volume | 10M rows | 3M rows | **2M rows** |
   | IVF-Flat rebuild time | ~50s | ~15s | **~10s** |
   | DiskANN rebuild time | ~300s | ~90s | **~60s** |
   | Unchanged segments | 0 | 2 groups | 8 files |
   | canAccept success rate | Low | Medium | **High** |
   
   ### Algorithm Compatibility
   
   | Algorithm | Precision Impact (PER_FILE) | Recommendation |
   |-----------|---------------------------|----------------|
   | IVF-Flat / IVF-PQ | ≈0% (IVF is partition-based) | PER_FILE |
   | DiskANN / HNSW | -3~8% (graph connectivity severed) | FILE_GROUP |
   
   **IVF algorithms are naturally suited for sub-sharding** since they search 
each partition independently. Graph-based indexes (DiskANN/HNSW) lose 
cross-shard neighbor connectivity, so FILE_GROUP with larger shards (2-5M rows) 
is recommended for them.
   
   ## Design Overview
   
   ### Core Changes
   
   1. **`ShardPartitioner`** (new): Partitions level files into shards based on 
configured scope
   2. **`PrimaryKeyIndexLevels.pick()`**: Returns plans for individual shards 
instead of entire levels
   3. **`PkVectorBucketIndexState`**: Validates segments per-shard (partial 
match) instead of exact full-level match
   4. **`BucketedVectorIndexMaintainer`**: Supports multiple parallel 
`PendingBuild` tasks for different shards
   5. **`PrimaryKeyVectorBucketSearch`**: Searches multiple sub-shard segments 
and merges results
   6. **`PrimaryKeyIndexSourceMeta`**: Extended with `shardIndex` field 
(version 2, backward compatible)
   
   ### Configuration
   
   ```sql
   'pk-vector.shard.scope' = 'per-file'              -- level | file-group | 
per-file
   'pk-vector.shard.target-row-count' = '5000000'    -- file-group mode: target 
rows per group
   'pk-vector.shard.max-files-per-group' = '4'       -- file-group mode: max 
files per group
   'pk-vector.shard.max-parallel-builds' = '3'       -- max concurrent shard 
builds
   ```
   
   ### Search Path
   
   ```
   Per-File mode, 10 segments in a level:
     → Parallel ANN search on 10 small segments (each ~1M rows, ~0.8ms)
     → Merge results → global topK
     → Total latency (parallel): ~1.8ms vs current 5ms (faster due to smaller 
graphs)
   ```
   
   ### Backward Compatibility
   
   - `PrimaryKeyIndexSourceMeta` version upgrade (V1 → V2), V1 still readable
   - Default `scope=level` preserves existing behavior
   - Online upgrade: change scope → next compact cycle gradually replaces 
segments
   - Downgrade: set `scope=level` → next compact rebuilds full-level segment
   
   ## Performance Summary
   
   | Dimension | LEVEL | FILE_GROUP | PER_FILE |
   |-----------|-------|-----------|---------|
   | Rebuild cost | High (full) | Medium (1/3-1/5) | Low (1/N) |
   | Search precision (IVF) | Baseline | ≈Same | ≈Same |
   | Search precision (graph) | Highest | -2~3% | -3~8% |
   | Search latency (parallel) | Baseline | Faster | Fastest |
   | `canAccept` success | Low | Medium | High |
   | Storage overhead | Baseline | +5% | +10% |
   | Best for IVF | ✓ | ✓✓ | ✓✓✓ |
   | Best for DiskANN | ✓✓✓ | ✓✓ | ✓ |
   
   ## Key Code References
   
   - `PrimaryKeyIndexLevels.java` - current single-segment-per-level enforcement
   - `PkVectorBucketIndexState.java` - current exact full-level match validation
   - `BucketedVectorIndexMaintainer.java` - current single PendingBuild model
   - `PrimaryKeyVectorBucketSearch.java` - current single-segment search path
   - PR #8672 "Align primary-key index maintenance with data levels"
   
   
   ### Solution
   
   _No response_
   
   ### Anything else?
   
   _No response_
   
   ### Are you willing to submit a PR?
   
   - [x] I'm willing to submit a PR!


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to