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=#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2022-04-01 KingbaseES触发器介绍