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

前端之家收集整理的这篇文章主要介绍了用第三方语言编写PostgreSQL 存储函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Postgresql里,所有的存储函数需求都可以用PLPGsql来实现。同时也支持用第三方语言来编写,这个就得看自己哪个方面熟练了。
不过要注意的一点是 PLPGsql的效率怎么着都比其他第三方语言来的高效。
比如,简单的插入表的存储函数


  1. CREATE OR REPLACE FUNCTION ytt.insert_plpgsql(f_num integer)
  2. RETURNS void
  3. LANGUAGE plpgsql
  4. AS $ytt$
  5. declare i int := 0;
  6. v_rank int := 0;
  7. v_log_time timestamp;
  8. begin
  9. while i < f_num
  10. loop
  11. v_rank = ceil(random()*100);
  12. v_log_time = now() - '1 day'::interval*ceil(random()*50);
  13. insert into t1 (rank,log_time) values (v_rank,v_log_time);
  14. i = i + 1;
  15. end loop;
  16. end;
  17. $ytt$;


现在来插入100W条记录,花费时间大概为27秒。


  1. t_girl=# select insert_plpgsql(1000000);
  2. insert_plpgsql
  3. ----------------
  4. (1 row)
  5.  
  6.  
  7. Time: 27286.668 ms



我们改用python 来实现
在编写python 脚本前,确保系统已经载入了plpythonu扩展。
  1. t_girl=# \dx plpythonu
  2. List of installed extensions
  3. Name | Version | Schema | Description
  4. -----------+---------+------------+------------------------------------------
  5. plpythonu | 1.0 | pg_catalog | PL/PythonU untrusted procedural language
  6. (1 row)



以下是函数体:


  1. CREATE OR REPLACE FUNCTION ytt.insert_py(f_num integer)
  2. RETURNS void
  3. LANGUAGE plpythonu
  4. AS $ytt$
  5. import datetime
  6. import random
  7. i = 0
  8. while i < f_num:
  9. v_rank = random.randrange(0,100)
  10. v_log_time = datetime.datetime.now() - datetime.timedelta(days=random.randrange(0,50))
  11. query0 = "insert into ytt.t1 (rank,log_time) values (" + str(v_rank) + ",'" + str(v_log_time)+ "')"
  12. plpy.execute(query0)
  13. i += 1
  14. $ytt$;




清空表t1.
同样插入100W条记录, 这时候,时间上的差别显而易见了,用python 写的程序效率比数据库内部的语言慢了3倍。
  1. t_girl=# select insert_py(1000000);
  2. insert_py
  3. -----------
  4. (1 row)
  5.  
  6.  
  7. Time: 86061.558 ms




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


  1. CREATE OR REPLACE FUNCTION ytt.insert_multi_py(f_num integer,f_values integer)
  2. RETURNS text
  3. LANGUAGE plpythonu
  4. AS $ytt$
  5. import datetime
  6. import random
  7. i = 0
  8. j = 0
  9. query0 = "insert into ytt.t1(rank,log_time) values "
  10. data0 = ''
  11. if (f_num/f_values)*f_values < f_num:
  12. return 'Parameters should be times relation.(f_num:1000,f_values:10)'
  13. else:
  14. while i < int(f_num/f_values):
  15. j = 0
  16. while j < f_values:
  17. v_rank = random.randrange(0,100)
  18. v_log_time = datetime.datetime.now() - datetime.timedelta(days=random.randrange(0,50))
  19. data0 = data0 + ",(" + str(v_rank) + ",'" + str(v_log_time)+ "')"
  20. j += 1
  21. result0 = query0 + data0[1:len(data0)]
  22. plpy.execute(result0)
  23. data0 = ''
  24. i += 1
  25. return 'Inserting ' + str(f_num) + ' rows'
  26. $ytt$;




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


  1. t_girl=# select insert_multi_py(1000000,20);
  2. insert_multi_py
  3. ------------------------
  4. Inserting 1000000 rows
  5. (1 row)
  6.  
  7.  
  8. Time: 27587.715 ms
  9. t_girl=#

猜你在找的Postgre SQL相关文章