【原创】用第三方语言编写PostgreSQL存储函数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【原创】用第三方语言编写PostgreSQL存储函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1946字,纯文字阅读大概需要3分钟。
内容图文
在PostgreSQL里,所有的存储函数需求都可以用PLPGSQL来实现。同时也支持用第三方语言来编写,这个就得看自己哪个方面熟练了。不过要注意的一点是PLPGSQL的效率怎
在PostgreSQL里,所有的存储函数需求都可以用PLPGSQL来实现。同时也支持用第三方语言来编写,,这个就得看自己哪个方面熟练了。
不过要注意的一点是 PLPGSQL的效率怎么着都比其他第三方语言来的高效。
比如,简单的插入表的存储函数:
CREATE OR REPLACE FUNCTION ytt.insert_plpgsql(f_num integer)
RETURNS void
LANGUAGE plpgsql
AS $ytt$
declare i int := 0;
v_rank int := 0;
v_log_time timestamp;
begin
while i < f_num
loop
v_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
我们改用python 来实现
在编写python 脚本前,确保系统已经载入了plpythonu扩展。
t_girl=# \dx plpythonu
List of installed extensions
Name | 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 void
LANGUAGE plpythonu
AS $ytt$
import datetime
import random
i = 0
while 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 text
LANGUAGE plpythonu
AS $ytt$
import datetime
import random
i = 0
j = 0
query0 = "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 = 0
while 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 += 1
result0 = query0 + data0[1:len(data0)]
plpy.execute(result0)
data0 = ''
i += 1
return '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 ms
t_girl=#
本文出自 “上帝,咱们不见不散!” 博客,请务必保留此出处
内容总结
以上是互联网集市为您收集整理的【原创】用第三方语言编写PostgreSQL存储函数全部内容,希望文章能够帮你解决【原创】用第三方语言编写PostgreSQL存储函数所遇到的程序开发问题。
如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
来源:【匿名】