随着配置单元查询中连接数的增加,查询将分多个阶段运行并占用大量执行时间。如何提高查询性能。有什么参数需要设置吗?
klh5stk11#
除上述情况外,当查询的select或where子句不引用右表时,最好使用left-semi-join。半连接比更一般的内部连接更有效的原因如下。对于左手表中的给定记录,只要找到匹配的记录,配置单元就可以停止在右手表中查找匹配的记录。此时,可以投影左侧表记录中选定的列
imzjd6km2#
set hive.exec.parallel = True
这是一般性的,使用适当的set命令,我们可以根据集群配置优化查询。
zkure5ic3#
首先,大表应该按照联接顺序放置在最后一个表中:选择small.,large。从小到大join large on small.joinkey=large.joinkey;您可以使用提示告诉optimazier哪个表最大:
SELECT/*+ STREAMTABLE(large) */ small.*, large.* FROM large JOIN small ON small.joinkey=large.joinkey;
其次,可以在join by map side join上将小表缓存在内存中:
set hive.auto.convert.join = true; SELECT a.*, b.* FROM a JOIN b ON a.joinkey=b.joinkey;
Map联接表的大小由以下设置:
set hive.mapjoin.smalltable.filesize = 1000000;
希望对你有点帮助。德国劳埃德!
3条答案
按热度按时间klh5stk11#
除上述情况外,当查询的select或where子句不引用右表时,最好使用left-semi-join。
半连接比更一般的内部连接更有效的原因如下。对于左手表中的给定记录,只要找到匹配的记录,配置单元就可以停止在右手表中查找匹配的记录。此时,可以投影左侧表记录中选定的列
imzjd6km2#
这是一般性的,使用适当的set命令,我们可以根据集群配置优化查询。
zkure5ic3#
首先,大表应该按照联接顺序放置在最后一个表中:选择small.,large。从小到大join large on small.joinkey=large.joinkey;您可以使用提示告诉optimazier哪个表最大:
其次,可以在join by map side join上将小表缓存在内存中:
Map联接表的大小由以下设置:
希望对你有点帮助。德国劳埃德!