我们有两个包含大量数据的表。我们必须在这两个表之间执行内连接。连接条件基于3列c1,c2,c3。
需要您的帮助,为上述方案编写优化查询。 请参考下面的数据模型。
table1
c1,c2,c3,c4,c5
table2
c1,c2,c3
感谢您的帮助。感谢。
答案 0 :(得分:2)
如果我理解正确Hortonworks' founder 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)
答案 1 :(得分:1)
因为看起来你没有使用table2中的任何新数据,逻辑是“返回table2中存在于table2中的所有行”。这是通过使用left semi join
完成的
如果table2不是uniqe,则记录数可能会增加(c1 c2 c3的同一组合出现多次)。
答案 2 :(得分:0)
内连接将为您提供表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)