用第三方語言編寫PostgreSQL 儲存函數

來源:互聯網
上載者:User

在PostgreSQL裡,所有的儲存函數需求都可以用PLPGSQL來實現。同時也支援用第三方語言來編寫,這個就得看自己哪個方面熟練了。
不過要注意的一點是 PLPGSQL的效率怎麼著都比其他第三方語言來的高效。
比如,簡單的插入表的儲存函數:


CREATE OR REPLACE FUNCTION ytt.insert_plpgsql(f_num integer) RETURNS void LANGUAGE plpgsqlAS $ytt$declare i int := 0;              v_rank int := 0;      v_log_time timestamp;beginwhile 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 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 text LANGUAGE 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 = 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 mst_girl=# 


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.