我们知道Citus中,建表的时候要执行分布键,表按分布键分布到不同的worker节点中,当进行全表扫描时,也因为将分布式表分布到了众多的worker节点中,所以在进行全表扫描时,它的结果集顺序是不确定的,因为每次执行的时候,CN节点汇集worke节点的数据时,worker节点到cn节点先后顺序每次都有可能不同,造成了结果集顺序的不同。这一点是需要注意的,与Postgres等非分布式数据库是不太一样的。
Greenplum也是将数据按分布键分布到不同的segments中,所以,在Greenplum中进行全表(分布式表)扫描,同样结果集的顺序会不确定,每次执行的结果顺序可能会不同。
create table dt2(a int, b int)
select create_distributed_table('dt2','a');
insert into dt2 values (1,1), (4,2), (2,3);
-- 第一次执行
postgres@postgres=# select * from dt2;
a | b
---+---
2 | 3
1 | 1
4 | 2
(3 rows)
-- 第二次执行结果顺序与第一次不同
postgres@postgres=# select * from dt2;
a | b
---+---
1 | 1
4 | 2
2 | 3
(3 rows)
-- 加上order by ,每次顺序一致
postgres@postgres=# select * from dt2 order by a;
a | b
---+---
1 | 1
2 | 3
4 | 2
(3 rows)
我们看一下其执行计划:
postgres@postgres=# explain select * from dt2;
QUERY PLAN
------------------------------------------------------------------------------
Custom Scan (Citus Adaptive) (cost=0.00..0.00 rows=100000 width=8)
Task Count: 2
Tasks Shown: All
-> Task -- worker1 节点
Node: host=127.0.0.1 port=5433 dbname=postgres
-> Seq Scan on dt2_102010 dt2 (cost=0.00..32.60 rows=2260 width=8)
-> Task -- worker2 节点
Node: host=127.0.0.1 port=5434 dbname=postgres
-> Seq Scan on dt2_102011 dt2 (cost=0.00..32.60 rows=2260 width=8)
(9 rows)
可以看到,其全表扫描的过程,是在CN节点,将任务拆分成每个worker节点可执行的任务。也就是将select * from dt2拆分成了worker1节点执行select * from dt2_102010;和select * from dt2_102011;。 两个worker节点各自在本节点扫描,并将结果集汇集到CN节点。
当然不同的SQL语句,其分布式执行计划是不同的,比如select * from dt2 order by a,
postgres@postgres=# explain select * from dt2 order by a;
QUERY PLAN
------------------------------------------------------------------------------------
Sort (cost=8304.82..8554.82 rows=100000 width=8)
Sort Key: remote_scan.a
-> Custom Scan (Citus Adaptive) (cost=0.00..0.00 rows=100000 width=8)
Task Count: 2
Tasks Shown: All
-> Task
Node: host=127.0.0.1 port=5433 dbname=postgres
-> Seq Scan on dt2_102010 dt2 (cost=0.00..32.60 rows=2260 width=8)
-> Task
Node: host=127.0.0.1 port=5434 dbname=postgres
-> Seq Scan on dt2_102011 dt2 (cost=0.00..32.60 rows=2260 width=8)
(11 rows)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




