怎么实现数据库分区表+dblink异步调用并行
发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,本篇内容介绍了"怎么实现数据库分区表+dblink异步调用并行"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学
千家信息网最后更新 2024年11月23日怎么实现数据库分区表+dblink异步调用并行
本篇内容介绍了"怎么实现数据库分区表+dblink异步调用并行"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
分区表 + dblink 异步调用 并行
1、创建分区表
create table t_img (id int primary key, sig signature) partition by hash (id);
2、创建64个分区
do language plpgsql $$ declare i int; begin for i in 0..63 loop execute format('create table t_img%s partition of t_img for values WITH (MODULUS 64, REMAINDER %s)', i, i); end loop; end; $$;
3、创建图像特征值字段索引
create index idx_t_img_1 on t_img using gist(sig);
4、写入4亿随机图像特征值
vi test.sql \set id random(1,2000000000) insert into t_img values (:id, gen_rand_img_sig(10)) on conflict(id) do nothing;
pgbench -M prepared -n -r -P 1 -f ./test.sql -c 64 -j 64 -t 10000000
dblink 异步调用封装
1、创建dblink插件
create extension if not exists dblink;
2、创建一个建立连接函数,不报错
create or replace function conn( name, -- dblink名字 text -- 连接串,URL ) returns void as $$ declare begin perform dblink_connect($1, $2); return; exception when others then return; end; $$ language plpgsql strict;
3、编写一个函数,输入参数为分区数,图像特征值。开启64个并行同时搜索每个分区,返回一条最相似的图像记录。
create or replace function parallel_img_search( v_mod int, -- 分区数 v_sig signature, -- 图像特征值 conn text default format('hostaddr=%s port=%s user=%s dbname=%s application_name=', '127.0.0.1', current_setting('port'), current_user, current_database()) -- dblink连接 ) returns setof record as $$ declare app_prefix text := 'abc'; sql text; ts1 timestamp; begin for i in 0..v_mod loop perform conn(app_prefix||i, conn||app_prefix||i); perform id,sig from dblink_get_result(app_prefix||i, false) as t(id int, sig signature); sql := format('select * from t_img%s order by sig <-> %L limit 1', i, v_sig); perform dblink_send_query(app_prefix||i, sql); end loop; ts1 := clock_timestamp(); for i in 0..v_mod loop return query select id,sig from dblink_get_result(app_prefix||i, false) as t(id int, sig signature); end loop; raise notice '%', clock_timestamp()-ts1; return; end; $$ language plpgsql strict;
4、创建一个stable函数,用于生成随机图像特征值。
create or replace function get_rand_img_sig(int) returns signature as $$ select ('('||rtrim(ltrim(array(select (random()*$1)::float4 from generate_series(1,16))::text,'{'),'}')||')')::signature; $$ language sql strict stable;
例子
postgres=# select get_rand_img_sig(10); get_rand_img_sig ------------------------------------------------------------------------------------------------------------------------------------------------------------------ (3.970030, 2.340900, 0.946223, 5.951010, 6.560340, 7.922950, 6.646290, 0.430310, 7.690120, 5.799870, 1.337850, 1.319830, 3.178170, 6.439380, 0.925341, 2.215810) (1 row) Time: 0.345 ms
5、写入约2.98亿图像特征值。
postgres=# select count(*) from t_img; count ----------- 297915819 (1 row)
使用dblink异步调用并行查询64个分区
使用dblink异步调用接口,查询所有分区,耗时:394毫秒
postgres=# select * from parallel_img_search(63, '(3.970030, 2.340900, 0.946223, 5.951010, 6.560340, 7.922950, 6.646290, 0.430310, 7.690120, 5.799870, 1.337850, 1.319830, 3.178170, 6.439380, 0.925341, 2.215810)'::signature) as t (id int, sig signature) order by sig <-> '(3.970030, 2.340900, 0.946223, 5.951010, 6.560340, 7.922950, 6.646290, 0.430310, 7.690120, 5.799870, 1.337850, 1.319830, 3.178170, 6.439380, 0.925341, 2.215810)'::signature limit 1; NOTICE: 00:00:00.394257 id | sig ------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------ 1918283556 | (3.122560, 2.748080, 1.133250, 5.426950, 6.626340, 6.876810, 7.959190, 0.798523, 8.638600, 5.075110, 1.366100, 0.899454, 2.980070, 4.580630, 0.986704, 1.582110) (1 row) Time: 741.161 ms
直接查询单个分区耗时:238毫秒
postgres=# explain (analyze,verbose,timing,costs,buffers) select sig from t_img48 order by sig <-> '(3.970030, 2.340900, 0.946223, 5.951010, 6.560340, 7.922950, 6.646290, 0.430310, 7.690120, 5.799870, 1.337850, 1.319830, 3.178170, 6.439380, 0.925341, 2.215810)' limit 1; QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=0.36..0.37 rows=1 width=72) (actual time=231.287..231.288 rows=1 loops=1) Output: id, sig, ((sig <-> '(3.970030, 2.340900, 0.946223, 5.951010, 6.560340, 7.922950, 6.646290, 0.430310, 7.690120, 5.799870, 1.337850, 1.319830, 3.178170, 6.439380, 0.925341, 2.215810)'::signature)) Buffers: shared hit=11881 -> Index Scan using t_img48_sig_idx on public.t_img48 (cost=0.36..41619.32 rows=4466603 width=72) (actual time=231.285..231.285 rows=1 loops=1) Output: id, sig, (sig <-> '(3.970030, 2.340900, 0.946223, 5.951010, 6.560340, 7.922950, 6.646290, 0.430310, 7.690120, 5.799870, 1.337850, 1.319830, 3.178170, 6.439380, 0.925341, 2.215810)'::signature) Order By: (t_img48.sig <-> '(3.970030, 2.340900, 0.946223, 5.951010, 6.560340, 7.922950, 6.646290, 0.430310, 7.690120, 5.799870, 1.337850, 1.319830, 3.178170, 6.439380, 0.925341, 2.215810)'::signature) Buffers: shared hit=11881 Planning Time: 0.060 ms Execution Time: 237.818 ms (9 rows) Time: 238.242 ms
"怎么实现数据库分区表+dblink异步调用并行"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
图像
特征
特征值
分区表
函数
查询
数据
数据库
内容
更多
知识
实用
相似
学有所成
接下来
例子
单个
参数
同时
名字
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全宣传精彩活动持续进行中
代理服务器的安全证书
邯郸电脑软件开发哪家好
只有域名没有服务器可以建站吗
家庭存储服务器解决方案
考研网络安全专业试题
英文重要数据库
数据库和本地文件同步
绝地sea服务器
国家顶级域服务器
csgo指令重连服务器
手游的游戏服务器怎么搭建
网络安全情报 反恐
csgo的服务器有什么用
大连科艺软件开发有限公司
金蝶软件开发教程视频
成都蜀山论剑网络安全大会
金华轶诺网络技术
找共表达基因用哪个数据库查找
手游云顶之翼无法连接服务器
四川大学网络安全张明序
数据库信息化教学设计
温州定制app软件开发公司
公众号软件开发如何收费
达梦数据库精度最大字段
软件开发成本的项目包括
海口数据中心服务器
计算机网络安全知识点总结
数据库安装实例名不能选默认
直播软件开发过程