- 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