用第三方语言编写PostgreSQL 存储函数

在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$;

相关推荐