sql—如何在使用多个大表时优化配置单元中的连接性能

tgabmvqs  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(323)

我们在hive中使用多个大表和小表。我们需要执行多个 INNER JOIN 但是我加入的执行在3个小时后也没有完成。我使用了一种技巧,我们最终需要使用大表。
我的示例代码如下:

SELECT 
    a.name,
    a.qual,
    a.year
FROM emp 1 a
    INNER JOIN emp2 b
        ON trim(a.qual) = (b.qual)
    INNER JOIN emp3 c
        ON trim(a.qual) = (c.qual)
    INNER JOIN emp4 d
        ON trim(c.year) = (d.year)
    INNER JOIN emp5 e
        ON trim(a.qual) = (e.qual)
AND trim(d.marks) = (e.marks)
GROUP BY 
    a.name,
    a.qual,
    a.year;

emp1 = count 5677
emp2 = count 7890900
emp3 = count 8755788
emp4 = count 78524565
emp5 = count 875684265

上面的表格有名字,年龄,月份,质量,年份的模式。这些不是实际的表格。为了给出逻辑,我重新命名了表名和列名。我真正的逻辑和表计数几乎是一样的。

xpcnnkqh

xpcnnkqh1#

您没有从主表中筛选任何行 emp1 . 在这种情况下,全表扫描是该表的最佳解决方案。它有5公里的行,所以任何长度都不是问题。
但是,在访问相关表时,可能需要使用索引。我会尝试:

create index ix1 on emp5 (qual);

create index ix2 on emp4 (year);

create index ix3 on emp3 (qual);

create index ix4 on emp2 (qual);

这些索引应该会大大提高连接性能,但这仍然取决于您实际从每个表中选择了多少行。
如果这没有帮助,那么您需要检索查询的执行计划。如果你把它贴出来,我们可以帮你看。
另外,修复数据模型、清理数据和删除 trim() 正在使用的函数。尽管如此,它似乎对这个查询并不重要,因为嵌套循环联接(nlj)无论如何都应该在这种情况下有效地工作。
祝你好运。

相关问题