今天在prestodb的qq群里看到有人提到说一个子查询在presto中非常慢:
SELECT *
FROM his_data_opt
WHERE act_no IN (
SELECT act_no
FROM id_act_map
WHERE id_number = '726067685144725'
);
可以看出,这是一个普通的非相关子查询,如果内部子查询经过过滤条件只剩几条,那么整个查询应该非常完美的在几秒中出结果,结果却卡着不动。原来是presto join处理的问题,对于普通的where条件,外部查询会把这个where条件下推,进行表过滤,但现在外表这个过滤条件是一个动态生成的条件,presto在进行上层的逻辑计划优化时,不知道这个动态生成的条件到底会产生多少条结果,于是presto把外部表进行了全表扫描,这在presto中成为dynamic filter,目前有人提了PR,还没有合并到主版本中。来看presto中的执行计划,查询语句如下