巧用dblink 实现多进程并行查询
概述
对于分区表的大数据统计分析,由于数据量巨大,往往需要采用并行。但是数据库并行的效率相比分进程分表统计还是有比较大的差距。本文通过巧用dblink,实现分进程分分区统计数据。
例子
kingbase=# \d t751
分区表 "public.t751"
栏位 | 类型 | 校对规则 | 可空的 | 预设
------+-----------------------------+----------+----------+------
id | bigint | | not null |
code | text | | |
c1 | timestamp without time zone | | |
c2 | text | | |
c3 | numeric | | |
c4 | integer | | |
c5 | integer | | |
c6 | integer | | |
v2 | numeric | | |
v3 | timestamp without time zone | | |
分区键值: HASH (c4, c5, c6)
分区的数量:1000(可以使用 \d+ 来列出它们)
表空间:"nvmtbs01" kingbase=# select pg_size_pretty(sum(pg_relation_size(relid))) from pg_partition_tree('t751');
pg_size_pretty
----------------
20 GB
并行方式访问
kingbase=# explain analyze select c4, c5, c6, sum(v2) v2 from t751 group by c4, c5, c6;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------
Finalize GroupAggregate (cost=5656234.57..14706860.46 rows=8000000 width=44) (actual time=15764.781..19110.336 rows=11781 loops=1)
Group Key: t751_872.c4, t751_872.c5, t751_872.c6
-> Gather Merge (cost=5656234.57..13806860.46 rows=64000000 width=44) (actual time=15764.142..19103.239 rows=11902 loops=1)
Workers Planned: 8
Workers Launched: 7
-> Partial GroupAggregate (cost=5655234.43..5911484.32 rows=8000000 width=44) (actual time=15478.852..18479.480 rows=1488 loops=8)
Group Key: t751_872.c4, t751_872.c5, t751_872.c6
-> Sort (cost=5655234.43..5686484.41 rows=12499991 width=22) (actual time=15478.239..17066.239 rows=12500000 loops=8)
Sort Key: t751_872.c4, t751_872.c5, t751_872.c6
Sort Method: quicksort Memory: 1408511kB
Worker 0: Sort Method: quicksort Memory: 1371267kB
Worker 1: Sort Method: quicksort Memory: 1364497kB
Worker 2: Sort Method: quicksort Memory: 1374769kB
Worker 3: Sort Method: quicksort Memory: 1355381kB
Worker 4: Sort Method: quicksort Memory: 1352989kB
Worker 5: Sort Method: quicksort Memory: 1343974kB
Worker 6: Sort Method: quicksort Memory: 1386845kB
-> Parallel Append (cost=0.00..3156369.51 rows=12499991 width=22) (actual time=0.034..5045.596 rows=12500000 loops=8)
-> Parallel Seq Scan on t751_872 (cost=0.00..5849.56 rows=81756 width=22) (actual time=0.025..60.070 rows=196215 loops=1)
-> Parallel Seq Scan on t751_470 (cost=0.00..5753.10 rows=80410 width=22) (actual time=0.068..73.100 rows=192984 loops=1)
...
-> Parallel Seq Scan on t751_416 (cost=0.00..556.80 rows=10380 width=22) (actual time=0.009..5.736 rows=17646 loops=1)
-> Parallel Seq Scan on t751_885 (cost=0.00..315.77 rows=5877 width=22) (actual time=0.010..2.460 rows=9991 loops=1)
Planning Time: 26.450 ms
Execution Time: 19180.545 ms
注意:这里实际采用的是groupagg , 如果采用hashagg,执行效率会高很多
使用dblink方式
创建函数
create or replace function f_t_part(para int default 0)
returns table
(
c4 int,
c5 int,
c6 int,
v2 numeric
)
language plpgsql
immutable
parallel safe
as
$$
declare
vtabnam text;
atabnam text[];
begin
perform dblink_disconnect(conn)
from unnest(dblink_get_connections()) conn; perform dblink_connect('conn_' || sn, 'dbname=' || current_database())
from generate_series(1, para) sn; if para <= 0 then
for vtabnam in select relid from pg_partition_tree('t751')
loop
for c4,c5,c6,v2 in execute format('select c4, c5, c6, sum(v2) v2 from only %s group by c4, c5, c6 ;',vtabnam)
loop
return next ;
end loop;
end loop;
else
for atabnam in select string_to_array(string_agg(relid, ','), ',') relid
from pg_partition_tree('t751') with ordinality
, lateral ( select ordinality / para sn)
where isleaf
group by sn
loop perform dblink_is_busy(conn) = 0 from unnest(dblink_get_connections()) conn; perform conn,tabnam, dblink_send_query(conn,format('select c4, c5, c6, sum(v2) v2 from only %s group by c4, c5, c6 ;',tabnam)) sq
from (select unnest(dblink_get_connections()) conn, unnest(atabnam) tabnam) v
where tabnam is not null; for c4,c5,c6,v2 in
select tab.* from unnest(dblink_get_connections()) conn , dblink_get_result(conn) as tab(c4 int, c5 int, c6 int, v2 numeric)
loop
return next ;
end loop;
end loop;
end if; perform dblink_disconnect(conn) from unnest(dblink_get_connections()) conn;
return;
end;
$$;
执行效率
ingbase=# explain analyze select * from ft751_01();
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------
Function Scan on ft751_01 (cost=0.25..10.25 rows=1000 width=44) (actual time=32738.962..32739.288 rows=11781 loops=1)
Planning Time: 0.055 ms
Execution Time: 32741.655 ms
(3 行记录) kingbase=# explain analyze ^Jselect * from ft751_01(16);
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------
Function Scan on ft751_01 (cost=0.25..10.25 rows=1000 width=44) (actual time=5397.644..5398.189 rows=11781 loops=1)
Planning Time: 0.044 ms
Execution Time: 5398.887 ms
结论
实际验证,二者性能上差距并不大。用dblink 方式主要是可以更灵活的使用并行数量。这里的目的主要是向大家提供灵活使用并行的一种方法。
巧用dblink 实现多进程并行查询的更多相关文章
- Python:多进程并行编程与进程池
Python的并行编程可以采用multiprocessing或mpi4py模块来完成. multiprocessing是Python标准库中的模块,实现了共享内存机制,也就是说,可以让运行在不同处理器 ...
- Oracle并行查询出错
1.错误描写叙述 ORA-12801: 并行查询服务器P007中发出错误信号 ORA-01722:无效数字 12801.00000 -"error signaled in parallel ...
- SQL调优(SQL TUNING)并行查询提示(Hints)之pq_distribute的使用
pq_distribute提示通常被用于提升数据仓库中分区表间的连接操作性能. pq_distribute提示允许你确定参与连接的表数据行在生产和消费并行查询服务进程间如何分配. pq_distrib ...
- PostgreSQL9.6的新特性并行查询
PostgreSQL在2016年9月发布了9.6版本,在该版本中新增了并行计算功能,目前PG支持的并行查询主要是顺序扫描(Sequencial Scans),并且支持部分链接查询(join)和聚合(a ...
- 【Oracle】 并行查询
所谓并行执行,是指能够将一个大型串行任务(任何DML,一般的DDL)物理的划分为叫多个小的部分,这些较小的部分可以同时得到处理.何时使用并行执行:1.必须有一个非常大的任务 2.必须有充足的资源(CP ...
- KingbaseES 并行查询
背景:随着硬件技术的提升,磁盘的IO能力及CPU的运算能力都得到了极大的增强,如何充分利用硬件资源为运算加速,是数据库设计过程中必须考虑的问题.数据库是IO和CPU密集型的软件,大规模的数据访问需要大 ...
- dblink嵌套场景下 查询出现:ORACLE ORA-00600错误的解决
前段时间在做oracle查询的时候遇到了一个非常奇怪的现象,现将现象和解决过程记录下来,以备查看: 环境描述:A数据库通过dblink访问B数据库的视图,B数据库的视图的数据是通过B的dblink连接 ...
- 基于MongoDB分布式存储进行MapReduce并行查询
中介绍了如何基于Mongodb进行关系型数据的分布式存储,有了存储就会牵扯到查询.虽然用普通的方式也可以进行查询,但今天要介绍的是如何使用MONGODB中提供的MapReduce功能进行查询. ...
- 并行查询提高sql查询速度
新项目在使用Oracle开发中遇到测试库千万级数据导致数据慢,除去加索引和存储过程可以明显提速外,使用并行也可以提速 select /*+parallel(a,8)*/ a.* from a 加上/* ...
- SQLite中使用CTE巧解多级分类的级联查询
在最近的项目中使用ActiveReports报表设计器设计一个报表模板时,遇到一个多级分类的难题:需要将某个部门所有销售及下属部门的销售金额汇总,因为下属级别的层次不确定,所以靠拼接子查询的方式显然是 ...
随机推荐
- Swoole从入门到入土(22)——多进程[Process]
Swoole中的Process模块比原生php提供的pcntl模块,提供了更易用的多进程编程接口. 简单总结,Process模块有如下特点: · 可以方便的实现进程间通讯· 支持重定向标准输入和输出, ...
- 实操开源版全栈测试工具RunnerGo安装(四)Windows安装
以windows 10系统为例 视频教程:https://www.bilibili.com/video/BV14H4y1C71u/?spm_id_from=333.999.0.0 1.设置手动进入系统 ...
- Redis能保证数据不丢失吗?
大家即使没用过Redis,也应该都听说过Redis的威名. Redis是一种Nosql类型的数据存储,全称Remote Dictionary Server,也就是远程字典服务器,用过Dictionar ...
- 麒麟系统开发笔记(十一):在国产麒麟系统上使用gdb定位崩溃异常方法流程进阶定位代码行数及专项测试Demo
前言 上一篇,通过研究,可以定位到函数,本篇进一步优化,没有行数,程序较为复杂的时候,就无法定位,所以进一步定位. 本篇做了qBreakpad的研究,但是没有成功,过程也还是填出来,后来突然注意 ...
- 案例分享:Qt便携式致病菌快速检测仪(账号管理、实验过程、二维图表、历史数据、通讯管理、实验报告、中英文等等)
需求 根据提供的用户原型设计.ui设计.通讯协议研发便携式致病菌快速检测仪器软件. 100%还原ui. 基本主功能(推荐visio:★★★☆☆,前期主流程需求整理) Dem ...
- python内置模块argparse的使用
官网文档 https://docs.python.org/3/howto/argparse.html # 简易教程 https://docs.python.org/3/library/argparse ...
- 详解SSL证书系列(2)SSL证书对网站的好处
在如今谷歌.百度等互联网巨头强制性要求网站 HTTPS 化的情况下, 网站部署 SSL 证书已然成为互联网的发展趋势,我们也知道了 SSL证书可以防止网络安全威胁.那么除此外为网站部署 SSL 证书还 ...
- HttpClient实现https调用
在HttpClient 4.x版本中引入了大量的构造器设计模式 https请求建立详解 首先建立一个信任任何密钥的策略.代码很简单,不去考虑证书链和授权类型,均认为是受信任的: class AnyTr ...
- 【Azure API 管理】APIM服务资源删除后,为什么不能马上创建相同名称的APIM服务呢?
问题描述 使用Azure APIM服务,在删除旧资源准备新建相同名称的新APIM服务时,尝试多次都是出现"指定的服务名称已正在使用"错误.但实际上同名称的服务已经被删除.为什么多次 ...
- opencv库图像基础3直方图-python
opencv库图像基础3直方图-python 直方图是什么 OpenCV 中的直方图是图像中像素值分布情况的统计表示.它是图像空间域内像素值分布的图形表示,以便更好地理解颜色分布. 灰度直方图是图像中 ...