并行查询
功能描述
Vastbase利用多 CPU 让查询更快,这种特性被称为并行查询。由于现有实现的限制很多查询并不能从并行查询获益,对于那些可以从并行查询获益的查询来说,并行查询带来的速度提升是显著的。
Vastbase支持以下并行查询功能:
并行顺序扫描
在一个并行顺序扫描中,表块将在合作进程之间被划分。一次会分发一个块,这样对表的访问还是保持顺序方式。
使用并行顺序扫描需设置GUC参数
enable_seqscan
为on。并行索引扫描
在一个并行索引扫描或者并行只用索引的扫描中,合作进程轮流从索引读取数据。当前,并行索引扫描仅有B-Tree索引支持。每一个进程将认领一个索引块并且扫描和返回该索引块引用的所有元组,其他进程可以同时地从一个不同的索引块返回元组。并行B-Tree扫描的结果会以每个工作者进程内的顺序返回。
使用并行索引扫描需设置GUC参数
enable_indexscan
为on。使用并行仅索引扫描需设置GUC参数
enable_indexonlyscan
为on。并行位图扫描
在一个并行位图扫描中,一个进程被选为领导者。这个进程执行对一个或者多个索引的扫描并且构建出一个位图指示需要访问哪些表块。这些表块接着会在合作进程之间划分(和并行顺序扫描中一样)。换句话说,位图扫描以并行方式进行但底层的索引扫描不是并行。
使用并行位图扫描需设置GUC参数
enable_bitmapscan
为on。
注意事项
- 以下对象/场景不支持并行查询:
- 临时表
- 分区表
- ustore表
- CTE语句
- WITH FUNCTION语句
- 并行不安全的函数,即函数在PG_PROC系统表中proparallel值为u。
- 启用SMP,设置qury_dop>1。
- 需设置GUC参数
max_parallel_workers_per_gather
>0。
示例
前置步骤:根据需求配置并行查询相关GUC参数,参考并行查询参数。
set min_parallel_table_scan_size = 0;
set min_parallel_index_scan_size = 0;
set parallel_setup_cost = 0;
set parallel_tuple_cost = 0.0001;
set max_parallel_workers_per_gather = 2;
set parallel_leader_participation = on;
1、创建测试表、索引并插入测试数据。
create table t_parallel_1165614(id int,col varchar(20));
insert into t_parallel_1165614 values(generate_series(1,100000),'test'||generate_series(1,100000));
create index idx_1165614 on t_parallel_1165614(id);
2、开启顺序扫描并关闭其他扫描进行并行顺序扫描。
set enable_seqscan = on;
set enable_indexscan = off;
set enable_indexonlyscan = off;
set enable_bitmapscan = off;
explain select * from t_parallel_1165614;
结果返回如下:
QUERY PLAN
----------------------------------------------------------------------------------------
Gather (cost=0.00..708.33 rows=100000 width=13)
Workers Planned: 2
-> Parallel Seq Scan on t_parallel_1165614 (cost=0.00..698.33 rows=41667 width=13)
(3 rows)
3、开启索引扫描并关闭其他扫描进行并行索引扫描。
set enable_seqscan = off;
set enable_indexscan = on;
set enable_indexonlyscan = off;
set enable_bitmapscan = off;
explain select * from t_parallel_1165614 where id > 500;
结果返回如下:
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
Gather (cost=0.00..3464.47 rows=33333 width=62)
Workers Planned: 2
-> Parallel Index Scan using idx_1165614 on t_parallel_1165614 (cost=0.00..3461.13 rows=13889 width=62)
Index Cond: (id > 500)
(4 rows)
4、开启仅索引扫描并关闭其他扫描进行并行仅索引扫描。
set enable_seqscan = off;
set enable_indexscan = off;
set enable_indexonlyscan = on;
set enable_bitmapscan = off;
explain select id from t_parallel_1165614 where id > 500;
结果返回如下:
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------
Gather (cost=0.00..2946.95 rows=99493 width=4)
Workers Planned: 2
-> Parallel Index Only Scan using idx_1165614 on t_parallel_1165614 (cost=0.00..2937.00 rows=41455 width=4)
Index Cond: (id > 500)
(4 rows)
5、开启位图扫描并关闭其他扫描进行并行位图扫描。
set enable_seqscan = off;
set enable_indexscan = off;
set enable_indexonlyscan = off;
set enable_bitmapscan = on;
explain select * from t_parallel_1165614 where id > 500;
结果返回如下:
QUERY PLAN
-------------------------------------------------------------------------------------
Bitmap Heap Scan on t_parallel_1165614 (cost=1871.59..3791.69 rows=99528 width=13)
Recheck Cond: (id > 500)
-> Bitmap Index Scan on idx_1165614 (cost=0.00..1846.71 rows=99528 width=0)
Index Cond: (id > 500)
(4 rows)