首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >distributed_group_by_no_merge的作用是什么?

distributed_group_by_no_merge的作用是什么?
EN

Stack Overflow用户
提问于 2020-05-12 03:16:00
回答 1查看 1.4K关注 0票数 1

我知道,通过使用合并,分布式节点不会组合来自碎片的中间结果。

下面的SQL

代码语言:javascript
复制
select sum(xxxxx),xxxxx from (
    select sum(xxxx),xxxx 
    from (
        select count(xxx),xxx 
        from distributed_table group by xxx )  
    group by xxxx SETTINGS distributed_group_by_no_merge = 1
) group by xxxxx

我想知道sql的哪一部分将被发送到MergeTree节点,以便使用distributed_group_by_no_merge执行?是吗?从distributed_table组按xxx选择计数( xxx ))按xxxx设置组distributed_group_by_no_merge = 1

distributed_group_by_no_merge的参数如何改变分布式查询的行为?在MergeTree节点上执行哪些部分,在分布式节点上执行哪些部分?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-12 14:23:22

distributed_group_by_no_merge-param影响启动器节点(它是运行分布式查询的节点)如何形成分布式查询的最终结果:

  • 通过合并来自碎片本身的聚合中间态 (它需要将完整聚合的中间状态从碎片复制到启动器节点),distributed_group_by_no_merge =0(默认模式)
  • 或者从碎片中获得最终结果(当每个碎片将其一侧的中间聚合状态合并,并仅发送到启动器节点的最终结果时)。它大大提高了性能和资源消耗,但需要正确选择切分键distributed_group_by_no_merge =1。

我会将distributed_group_by_no_merge放在与定义的分布式表相同的子查询级别,以显式定义您的意图,并在有几个分布式子查询时避免混淆。

让我们看看如何检查这两种模式之间的差异(将使用数量-virtual列):

  1. distributed_group_by_no_merge=0
代码语言:javascript
复制
SELECT
    groupUniqArray(_shard_num) AS shards,
    ..
FROM table
WHERE ..
GROUP BY ..
SETTINGS distributed_group_by_no_merge = 0

/* Aggregated states were merged into ONE result set on initiator-node.
┌─shards────┬─ ..
│ [2, 1, 3] │  ..
└───────────┴─ ..
*/
  1. distributed_group_by_no_merge=1
代码语言:javascript
复制
SELECT
    groupUniqArray(_shard_num) AS shards,
    ..
FROM table
WHERE ..
GROUP BY ..
SETTINGS distributed_group_by_no_merge = 1

/* Get a set of final results (not aggregated states) from each shard. They should be unioned manually.
┌─shards─┬─ ..
│ [2]    │  ..
│ [1]    │  ..
│ [3]    │  ..
└────────┴─ ..
*/

如何避免合并分布式表上的高基数子选择聚合

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61743180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档