• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

【原创】用第三方语言编写PostgreSQL 存储函数

mysql 搞代码 4年前 (2022-01-09) 15次浏览 已收录 0个评论

在PostgreSQL里,所有的存储函数需求都可以用PLPGSQL来实现。同时也支持用第三方语言来编写,这个就得看自己哪个方面熟练了。不过要注意的一点是PLPGSQL的效率怎

在PostgreSQL里,所有的存储函数需求都可以用PLPGSQL来实现。同时也支持用第三方语言来编写,,这个就得看自己哪个方面熟练了。
不过要注意的一点是 PLPGSQL的效率怎么着都比其他第三方语言来的高效。
比如,简单的插入表的存储函数:

CREATE OR REPLACE FUNCTION ytt.insert_plpgsql(f_num integer)RETURNS voidLANGUAGE plpgsqlAS $ytt$declare i int := 0;v_rank int := 0;v_log_time timestamp;beginwhile i < f_numloopv_rank = ceil(random()*100);v_log_time = now() – '1 day'::interval*ceil(random()*50);insert into t1 (rank,log_time) values (v_rank,v_log_time);i = i + 1;end loop;end;$ytt$;现在来插入100W条记录,花费时间大概为27秒。t_girl=# select insert_plpgsql(1000000);insert_plpgsql—————-(1 row)Time: 27286.668 ms

本文来源gaodai#ma#com搞*!代#%^码$网!们改用python 来实现
在编写python 脚本前,确保系统已经载入了plpythonu扩展。

t_girl=# \dx plpythonuList of installed extensionsName | Version | Schema |Description———–+———+————+——————————————plpythonu | 1.0| pg_catalog | PL/PythonU untrusted procedural language(1 row)

以下是函数体:

CREATE OR REPLACE FUNCTION ytt.insert_py(f_num integer)RETURNS voidLANGUAGE plpythonuAS $ytt$import datetimeimport randomi = 0while i < f_num:v_rank = random.randrange(0,100)v_log_time = datetime.datetime.now() – datetime.timedelta(days=random.randrange(0,50))query0 = "insert into ytt.t1 (rank,log_time) values (" + str(v_rank) + ",'" + str(v_log_time)+ "')"plpy.execute(query0)i += 1$ytt$;

清空表t1.
同样插入100W条记录, 这时候,时间上的差别显而易见了,用python 写的程序效率比数据库内部的语言慢了3倍。

t_girl=# select insert_py(1000000);insert_py———–(1 row)Time: 86061.558 ms

那可以修改以上python 程序,让其效率来的高效一些,接近系统一些。 我们改用insert … values ..()…() 的方式。
下面是函数体:

CREATE OR REPLACE FUNCTION ytt.insert_multi_py(f_num integer, f_values integer)RETURNS textLANGUAGE plpythonuAS $ytt$import datetimeimport randomi = 0j = 0query0 = “insert into ytt.t1(rank,log_time) values “data0 = ”if (f_num/f_values)*f_values < f_num:return 'Parameters should be times relation.(f_num:1000,f_values:10)'else:while i < int(f_num/f_values):j = 0while j < f_values:v_rank = random.randrange(0,100)v_log_time = datetime.datetime.now() – datetime.timedelta(days=random.randrange(0,50))data0 = data0 + ",(" + str(v_rank) + ",'" + str(v_log_time)+ "')"j += 1result0 = query0 + data0[1:len(data0)]plpy.execute(result0)data0 = ''i += 1return 'Inserting ' + str(f_num) + ' rows'$ytt$;

清空表t1.
继续插入100W条数据, 这时,插入时间和原始PLPGSQL的时间一致了。

t_girl=# select insert_multi_py(1000000,20);insert_multi_py————————Inserting 1000000 rows(1 row)Time: 27587.715 mst_girl=#

本文出自 “上帝,咱们不见不散!” 博客,请务必保留此出处


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:【原创】用第三方语言编写PostgreSQL 存储函数

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址