用第三方语言编写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$;

清空表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 存储函数,布布扣,bubuko.com

时间: 2024-12-26 20:27:39

用第三方语言编写PostgreSQL 存储函数的相关文章

【原创】用第三方语言编写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

C语言 编写字符串操作函数strrchr,在字符串中查找目标字符最后一次出现的位置,返回指向这次位置的指针。

#include<stdio.h> #include<string.h> const char *my_strrchr(char const *str,int ch) { int i=0,len=0; len=strlen(str); for(i=len-1;i>=0;i--) { if(str[i]==ch) { return str+i; } } return NULL; } int main() { char ch='c'; char src[]="abcde

在Java语言中调用存储过程、存储函数、包头、包体

需要拷贝连接Oracle的jar包,路径如下图所示: 连接Oracle数据库的代码: package demo.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCUtils { private static Stri

编写MySQL存储存储函数

这篇博客总结了编写MySQL存储函数(function)的过程.调试思路.总结及参考资料. 0.准备 建立测试数据库 CREATE DATABASE IF NOT EXISTS `funcdemo`; 1.编写 首先写好function框架,定义好参数和返回值类型: USE funcdemo; DELIMITER ; DELIMITER $$ CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) BEGIN RETURN CONCAT('Hell

mysql存储过程、存储函数及流程控制

存储过程 一.基本语法 create procedure sp_name([proc_parameter[,...]]) [characteristic...]routine_body begin end sp_name 表示存储过程的名字 proc_parameter 存储过程参数例表[IN OUT INOUT]三个部分组成 其中IN 表示传进来的参数 其中OUT 表示传出去的参数 其中INOUT 表示传进来但最终传回的参数 routine_body 参数是SQL代码的内容(类似于触发器的fo

利用curl进行逆地理编码_c语言编写动态链接库对PostgreSQL进行扩展

流程: [1]c语言编写逆地理编码的函数,利用curl库和高德服务器进行地理坐标解析 [2]gcc生成动态链接库 [3]postgreSQL中加载动态链接库中的函数 [4]postgreSQL中将逆地理编码函数的返回类型进行转化 =========================================== [1]c语言编写逆地理编码的函数,利用curl库和高德服务器进行地理坐标解析 #include <stdio.h> #include <stdlib.h> #inclu

c语言:编写折半查找函数

编写折半查找函数 程序: #include <stdio.h> int binsearch(int x, int arr[], int len)//binsearch 折半,对分 { int left = 0; int right = len - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] < x) { left = mid + 1; } else if (arr[mid]

基于Perfect用Swift语言编写Slack聊天机器人

基于Perfect用Swift语言编写Slack聊天机器人 本项目是专门为Slack聊天机器人定制的模板服务器. 完整的源代码下载在Github https://github.com/PerfectServers/SlackBot 在本项目模板中,一个聊天机器人可以加入授权频道,读取频道内所有用户发送的"曲奇"并记录在案,而且可以直接答复用户的有关曲奇饼干的问题. 预备知识 在您决定编译.测试或者部署您自己的基于Perfect软件框架体系的聊天机器人之前,以下基础知识??不可或缺??:

C语言编写的bmp读写程序

C语言编写的bmp读写程序 建议先把bmp的数据存储格式了解下 [cpp] view plaincopy <span style="font-size:16px;">#include "Windows.h" #include "stdio.h" #include "string.h" #include "malloc.h" unsigned char *pBmpBuf;//读入图像数据的指针 i