Presto中LEFT JOIN/INNER JOIN的查询优化问题
Presto中JOIN写法对查询效率的影响
LEFT JOIN场景:两种写法有本质差异
首先要明确:这两种LEFT JOIN写法的结果集完全不同,不存在“哪种更高效”的选择问题——因为它们对应不同的业务逻辑:
- 写法1:
SELECT * FROM TABLE A LEFT JOIN TABLE B ON col_a = col_b
保留大表A的所有行,仅将匹配col_a=col_b的B表数据关联进来,不匹配的B表字段用NULL填充。结果集行数≥A表行数,是一个超大结果集。 - 写法2:
SELECT * FROM TABLE B LEFT JOIN TABLE A ON col_a = col_b
保留小表B的所有行,仅将匹配col_a=col_b的A表数据关联进来,不匹配的A表字段用NULL填充。结果集行数≥B表行数,是一个极小结果集。
如果业务需求是保留大表A的全部数据,只能用写法1;如果需求是保留小表B的全部数据,就用写法2。从执行效率看,写法2的整体查询耗时会远低于写法1,因为结果集大小差距极大;但这是业务逻辑决定的,而非写法优化的选择。
另外,Presto的查询优化器在处理JOIN时,会自动识别小表并执行广播连接(Broadcast Join):把小表数据分发到各个存储大表分片的节点,避免大表数据跨节点移动。无论LEFT JOIN的左表是大表还是小表,优化器都会优先广播小表,所以JOIN阶段的执行效率本身差异不大,核心差异还是结果集的大小。
INNER JOIN场景:两种写法无差异
对于INNER JOIN,SELECT * FROM TABLE A INNER JOIN TABLE B ON col_a = col_b和SELECT * FROM TABLE B INNER JOIN TABLE A ON col_a = col_b的结果集完全一致(仅列的顺序可能不同)。
Presto的优化器会自动忽略表的书写顺序,识别出小表B并将其作为广播表,执行广播连接优化。因此两种写法的执行效率几乎没有差异,不需要特意调整表的顺序。
内容的提问来源于stack exchange,提问作者Shlim
相关产品推荐
相关产品推荐

