我们有两个包含巨大数据的表。我们必须在这两个表之间执行内部联接。连接条件基于3列c1、c2、c3。
需要您的帮助来编写针对上述场景的优化查询。请参考下面的数据模型。
table1
c1,c2,c3,c4,c5
table2
c1,c2,c3
感谢你的帮助。谢谢
如果我正确理解Hortonworks的创始人Owen O'Malley,你可以通过编写来优化它
SELECT t1.* from table1 t1
JOIN (SELECT table2.* FROM table2) t2
ON (t1.c1=t2.c1 AND t1.c1 = t2.c2 AND t1.c3 = t2.c3)
因为您似乎没有使用表2中的任何新数据,逻辑是"返回表1中表2中存在的所有行"。这是通过使用left semi join
来完成的
如果表2不是唯一的(c1、c2、c3的相同组合出现多次),则记录数量可能会增加。
内部联接将为您提供表1和表2中存在的所有行,以及与表2中其他列存在的任何额外组合。像上面提到的@dimamah这样的左半联接将只提供左表1中存在的行。
对于第一个解决方案,您应该期待更多的行
SELECT t1.*
FROM table1 t1
INNER JOIN table2 t2
ON (t1.c1=t2.c1 AND t1.c1 = t2.c2 AND t1.c3 = t2.c3)
对于第二个解决方案,您将获得与t1 相同的行数
SELECT t1.*
FROM table1 t1
LEFT SEMI JOIN table2 t2
ON (t1.c1=t2.c1 AND t1.c1 = t2.c2 AND t1.c3 = t2.c3)