在yugabytedb中并行扫描(ysql_select_parallelism = -1)
#sql #database #yugabytedb #distributed

当您连接到yugabytedb ysql (postgresql兼容API)您的会话从一个过程(PostgreSql后端解析查询并执行计划)执行SQL语句,该语句 strong>和写入,由批次的行,从/到排为分布式的平板电脑服务器
在某些情况下,同时发送多批操作是有意义的,以便在多个平板电脑服务器中使用 Parallel 处理它们。在其他一些情况下,当这些操作返回很多行时,这可能不是有效的,因为这些行最终将通过SQL层上的一个过程处理。简而言之,当与过滤器聚合组合
结合使用时,并行扫描是有效的。请注意,碎片方法也很重要:如果期望排出排序行。这种低级优化仅发生在哈希碎片表上,这些表不会从中预期有特定的顺序。

并行性水平

并行执行的操作数由cluster参数--ysql_select_parallelism定义,--ysql_select_parallelism默认为-1。在这种设置的情况下,并行性是根据带有koude2的平板电脑服务器数量计算的。具有

的值

这是解码的方式:

ysql_select_parallelism tserver count 平行级
<0(默认-1) 1 2
<0(默认-1) 2 4
<0(默认-1) 3 6
<0(默认-1) 4 8
<0(默认-1) 5 10
<0(默认-1) 6 12
<0(默认-1) 7 14
<0(默认-1) 8或更多 16
0 任何 1(无平行)
> 0 任何 ysql_select_parallelism

为了测试它,我已经设置了一个带有9片平板电脑服务器的yugabytedb托管群集:

Image description

例子

我在yugabytedb 2.18上运行此并行化,其中仅在散布的表或索引上完成此并行化(因为可以在范围碎片上进行排序),而在其中有一些下降(Partial AggregateRemote Filter)(Partial AggregateRemote Filter)感觉并行扫描并将简化的集合返回到PostgreSQL后端。这发生在PgGate中,这是PostgreSQL执行计划与DOCDB分布式存储之间的层。发生在此级别上,从执行计划中看不到它。但是,响应时间给出了一个想法,这是一个示例

带有多个平板电脑

我正在创建一个带有多个平板电脑的表(默认>)(默认)(分配给多个tservers),并用count()5 查询:

yugabyte=> drop table if exists demo;
DROP TABLE
yugabyte=> create table demo ( id bigint primary key)
           split into 12 tablets;
CREATE TABLE
yugabyte=> insert into demo select generate_series(1,10000000) id;
INSERT 0 10000000

yugabyte=> select yb_table_properties('demo'::regclass) 
           , (select count(*) from yb_servers());

 yb_table_properties | count 
---------------------+-------
 (12,1,f,,)          |     9
(1 row)

yugabyte=> explain analyze select count(id) from demo;
                                                   QUERY PLAN                                                   
----------------------------------------------------------------------------------------------------------------
 Finalize Aggregate  (cost=102.50..102.51 rows=1 width=8) (actual time=1312.134..1312.134 rows=1 loops=1)
   ->  Seq Scan on demo  (cost=0.00..100.00 rows=1000 width=8) (actual time=1312.094..1312.102 rows=12 loops=1)
         Partial Aggregate: true
 Planning Time: 3.059 ms
 Execution Time: 1312.458 ms
 Peak Memory Usage: 64 kB
(6 rows)

响应时间大约是一秒钟的计数1000万行。

用一台平板电脑

我只用一台平板电脑运行相同的操作,这没有并联扫描的空间:

yugabyte=> drop table if exists demo;
DROP TABLE
yugabyte=> create table demo ( id bigint primary key)
           split into 1 tablets;
CREATE TABLE
yugabyte=> insert into demo select generate_series(1,10000000) id;
INSERT 0 10000000

yugabyte=> select yb_table_properties('demo'::regclass) 
           , (select count(*) from yb_servers());

 yb_table_properties | count 
---------------------+-------
 (1,1,f,,)          |     9
(1 row)

yugabyte=> explain analyze select count(id) from demo;     

                                               QUERY PLAN                                                    
------------------------------------------------------------------------------------------------------------------
 Finalize Aggregate  (cost=102.50..102.51 rows=1 width=8) (actual time=8298.744..8298.744 rows=1 loops=1)
   ->  Seq Scan on demo  (cost=0.00..100.00 rows=1000 width=8) (actual time=8298.732..8298.735 rows=1 loops=1)
         Partial Aggregate: true
 Planning Time: 0.039 ms
 Execution Time: 8298.819 ms
 Peak Memory Usage: 14 kB
(6 rows)

这有更高的响应时间,并证明并行扫描有效地减少了响应时间。请注意,这与将查询处理分配给多个后端的PostgreSQL并行查询不同。目前,这是在yugabytedb中被禁用的。