- https://trino.io/docs/current/admin/dynamic-filtering.html
- 避免读取被 join condititon filtered out 的数据,提升 selective joins 性能。
- 示例:
- ```sql
SELECT count(*) FROM
store_sales JOIN date_dim
ON store_sales.ss_sold_date_sk = date_dim.d_date_sk
WHERE d_following_holiday=’Y’ AND d_year = 2000;
```
- `store_sales` 是 fact table,`date_dim`是 dimension table
- 没有 dynamic filter 的情况下:
- 下推谓词并扫描维表 date_dim
- 扫描 store_sales 的==所有==数据(没有相关 filter)
- 启用 dynamic filter 时:
- 扫描 data_dim 后,从结果集中生成 runtime predicates,传递给 store_sales 的 table scan worker
- **dynamic partition pruning**
- runtime predicates 也会通过网络传递给 **coordinator**,coordinator 也可以利用它们,例如执行 partition pruning,跳过扫描无关的 partitions。
- 支持 **partitioned joins**
- coordinator 收集完 dynamic filters 后,通过网络分发给 worker nodes。
- dynamic filtering 的采用与否取决于多个因素:
- 支持某些 join 类型(inner, right, semi)及 join condititions
- connector 的能力:是否支持在运行时下推 filters 等
- build side table 的大小
- Dynamic filter collection thresholds
- CBO 基于统计信息选择小的维表作为 build side
- 收集 build side values 会带来额外的 CPU 开销,需要进行限制
- Trino defines thresholds on the size of dynamic filters collected from build side tasks.
- 例如当超过 `max-distinct-values-per-driver` 阈值时,降级只收集每列的 ==min / max== 值来减少开销(粒度更粗)。
> [!summary] Dynamic filter
> - 从 build side 扫描出的结果中生成谓词,下推给 probe side。
---
# TODO
- [ ] 如何从 build side 生成 filters