当您连接到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托管群集:
例子
我在yugabytedb 2.18上运行此并行化,其中仅在散布的表或索引上完成此并行化(因为可以在范围碎片上进行排序),而在其中有一些下降(Partial Aggregate
或Remote Filter
)(Partial Aggregate
或Remote 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中被禁用的。