千家信息网

怎么实现数据库分区表+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软件开发公司 公众号软件开发如何收费 达梦数据库精度最大字段 软件开发成本的项目包括 海口数据中心服务器 计算机网络安全知识点总结 数据库安装实例名不能选默认 直播软件开发过程
0