Amir Ganiev
11/12/2025, 8:51 PMSELECT * FROM <table> LIMIT 100; behaves very differently:
Iceberg plan
...
6:HASH JOIN
| join op: LEFT ANTI JOIN (BROADCAST)
| equal join conjunct: block_height = block_height
| equal join conjunct: order_in_block = order_in_block
| other join predicates: $data_sequence_number < $data_sequence_number
| limit: 100
|
|----5:EXCHANGE
|
3:IcebergScanNode
TABLE: datacloud_db.transfers_eth_processed_v3_with_delete_file
cardinality=1000000000
4:IcebergEqualityDeleteScanNode
TABLE: datacloud_db.transfers_eth_processed_v3_eq_delete_block_height_order_in_block
Iceberg identifier columns: [block_height, order_in_block]
...
As you can see Starrocks is trying to resolve the deletes before running the query. This causes a full dataset scan (data + equality delete files) before honoring the LIMIT.
Delta plan
0:DeltaLakeScanNode
TABLE: transfers_eth_processed_delta
cardinality=100
limit: 100
Here StarRocks seems able to push down the limit and prune aggressively.
What can we do on the Iceberg side so that StarRocks can avoid scanning the full dataset for simple selects and small limits? (any recommendations would be welcomed on the write/read/table side)Yan Zhang
11/13/2025, 2:01 AMYan Zhang
11/13/2025, 2:02 AMAmir Ganiev
11/18/2025, 5:48 PMYan Zhang
11/19/2025, 3:41 AM