kingbaseES 如何使用并行

KingbaseES 能使用多核 CPU 来加速一个 SQL 语句的执行时间,这种特性被称为并行查询。由于现实条件的限 制或因为没有比并行查询计划更快的查询计划存在,很多查询并不能从并行查询获益。但是,对于那些可以从并行查 询获益的查询来说,并行查询带来的速度提升是显著的。很多查询在使用并行查询时查询速度比之前快了超过两倍, 有些查询是以前的四倍甚至更多的倍数

并行相关参数

kingbase ES 中针对并行的设置 涉及以下几个参数

并行进程相关参数:

max_parallel_maintenance_workers :默认 2 用于维护的并行workers 数量。

max_parallel_workers:默认 8 用于并行的workers 总数量。

max_parallel_workers_per_gather:默认2 单个事务用于并行的数量。

优化器并行相关参数

min_parallel_index_scan_size    默认 64

为必须扫描的索引数据量设置一个最小值,扫描的索引数据量超过这一个值时才会考虑使用并行扫

min_parallel_table_scan_size    默认1024

为必须扫描的索引数据量设置一个最小值,扫描的索引数据量超过这一个值时才会考虑使用并行扫

enable_parallel_append :是否允许并行 append plans。

enable_parallel_hash :优化器控制开关,是否允许并行 hash plans。

parallel_leader_participation: 控制 Gather、Gather merge 节点是否能执行 subplans。

parallel_setup_cost  :默认  1000

执行计划评估并行的消耗

parallel_tuple_cost  :默认  0.1

执行优化器评估并行情况下单个tuple的资源消耗。

然后通过案例来看一下参数对并行的影响

构建测试数据

drop table app_family2;
CREATE TABLE app_family2 (
"family_id" character varying(32 char) NOT NULL,
"application_id" character varying(32 char) NULL,
"family_number" character varying(50 char) ,
"household_register_number" character varying(50 char),
"poverty_reason" character varying(32 char),
CONSTRAINT "pk_app_family_idpk2" PRIMARY KEY (family_id));
insert into app_family2 select generate_series(1,10000000),generate_series(1,10000000),'aaaa','aaa','bbb' from dual ;

实验一、参数影响是否走并行。

对表app_family2 使用并行查询

kingbase=# EXPLAIN ANALYZE SELECT /*+parallel(af 2)*/ * FROM "app_family2" af;
                                                              QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------
 Gather  (cost=0.00..0.00 rows=10000024 width=27) (actual time=0.507..1600.004 rows=10000000 loops=1)
   Workers Planned: 2
   Workers Launched: 2
   ->  Parallel Seq Scan on app_family2 af  (cost=0.00..0.00 rows=4166677 width=27) (actual time=0.028..691.566 rows=3333333 loops=3)
 Planning Time: 1.275 ms
 Execution Time: 2060.939 ms
(6 rows)

kingbase=#

设置max_parallel_workers_per_gather=0

kingbase=# set max_parallel_workers_per_gather=0;
SET
kingbase=# EXPLAIN ANALYZE SELECT /*+parallel(af 2)*/ * FROM "app_family2" af;
                                                          QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------
 Seq Scan on app_family2 af  (cost=0.00..174065.24 rows=10000024 width=27) (actual time=0.066..787.504 rows=10000000 loops=1)
 Planning Time: 0.062 ms
 Execution Time: 1093.011 ms
(3 rows)

kingbase=#

可以看到设置之后即使使用了hint 都不在走并行。 |

实验二、参数对并行度的影响

我们将max_parallel_workers_per_gather设置为4 看看sql 的并行执行情况

kingbase=# SET max_parallel_workers_per_gather=4;
SET
kingbase=#  EXPLAIN ANALYZE SELECT af.* FROM "app_family2" af;
                                                                QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------
 Gather  (cost=1000.00..110065.08 rows=10000024 width=27) (actual time=0.230..1222.215 rows=10000000 loops=1)
   Workers Planned: 4
   Workers Launched: 4
   ->  Parallel Seq Scan on app_family2 af  (cost=0.00..99065.06 rows=2500006 width=27) (actual time=0.028..322.301 rows=2000000 loops=5)
 Planning Time: 0.062 ms
 Execution Time: 1679.502 ms
(6 rows)

可以看到 最大的并行度虽然设置为了4 ,但是数据库只用4个workers 完成并行扫描。

实验三、执行计划评估参数影响

通过实验一可以看到,默认情况下数据库没有走并行,如果我们把优化器的评估参数调小之后看看是否会走并行。

kingbase=# SET parallel_tuple_cost=0.001
kingbase-# ;
SET
kingbase=# EXPLAIN ANALYZE SELECT af.* FROM "app_family2" af;
                                                                QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------
 Gather  (cost=1000.00..126731.79 rows=10000024 width=27) (actual time=0.623..1479.677 rows=10000000 loops=1)
   Workers Planned: 2
   Workers Launched: 2
   ->  Parallel Seq Scan on app_family2 af  (cost=0.00..115731.77 rows=4166677 width=27) (actual time=0.034..501.306 rows=3333333 loops=3)
 Planning Time: 0.221 ms
 Execution Time: 1847.782 ms
(6 rows)

kingbase=#

可以看到在修改了 parallel_tuple_cost=0.001 参数后即使我们不用hint 表也走了并行。

KingbaseES 支持并行的操作

• DML

• 全表扫描(Seq Scan)

• BTree 索扫描(B-tree Index Scan)

• Bitmap 扫描(Bitmap Heap Scan)

• 哈希连接(Hash Join)

• 嵌套循环连接(Nested Loop Join)

• 归并连接(Merge Join)

• 聚集(Aggregation)

• 排序(Sort)

• Append

• DDL

• 创建索引

• Create table as select

注意事项

函数对并行的影响

在工作中经常会碰到sql 中带自定义函数的比如

SELECT af.* , fun_getdistance1(family_id::NUMERIC,application_id::NUMERIC) FROM "app_family2" af ORDER BY "family_id" ;

这时候会发现即使使用了hint 也不会走并行,这是因为 自定义函数需要开启并行才可。

如果函数的并行参数是unsafe,即使我们使用了hint 也不会走并行。

修改方式如下:

SELECT *   FROM  sys_proc WHERE proname='fun_getdistance1'  --确认函数是否开启了并行

alter function fun_getdistance1 parallel safe;   -- sql中用到自定义函数需要走并行情况

hint 中指定的是别名

EXPLAIN ANALYSE  SELECT /*+parallel(af 2) */ "family_number" FROM app_family af  -- 由别名要用别名才可以走并行

CTE 中的with 子句不会执行并行

kingbase=# explain  analyze WITH a AS (SELECT * FROM app_family)
kingbase-# SELECT /*+parallel(app_family 2 )*/* FROM a;
                                                      QUERY PLAN
----------------------------------------------------------------------------------------------------------------------
 Seq Scan on app_family  (cost=0.00..17398.00 rows=1000000 width=25) (actual time=0.042..83.770 rows=1000000 loops=1)
 Planning Time: 0.056 ms
 Execution Time: 120.895 ms
(3 rows)

kingbase=#
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值