最近在测试cpu的avx指令集时无意中发现一个因为语句写法不同,性能相差极大的问题
一、定义两个测试函数
create or replace function md5_js() returns text as $$ declare v_i integer; v_md5 varchar; begin for v_i in 1..10000000 loop v_md5:=md5(random()::text); end loop; return 'ok'; end; $$ language plpgsql; create or replace function md5_js_select() returns text as $$ declare v_i integer; v_md5 varchar; begin for v_i in 1..10000000 loop select md5(random()::text) into v_md5; end loop; return 'ok'; end; $$ language plpgsql;
上面两个函数的功能是一样的,只是付值方式不一样
二、测试一下他们的执行时间
[postgres@pgsqldb-master bin]$ psql psql (9.2.3) Type "help" for help. postgres=# create or replace function md5_js() returns text as postgres-# $$ postgres$# declare postgres$# v_i integer; postgres$# v_md5 varchar; postgres$# begin postgres$# for v_i in 1..10000000 loop postgres$# v_md5:=md5(random()::text); postgres$# end loop; postgres$# return 'ok'; postgres$# end; postgres$# $$ postgres-# language plpgsql; CREATE FUNCTION postgres=# create or replace function md5_js_select() returns text as postgres-# $$ postgres$# declare postgres$# v_i integer; postgres$# v_md5 varchar; postgres$# begin postgres$# for v_i in 1..10000000 loop postgres$# select md5(random()::text) into v_md5; postgres$# end loop; postgres$# return 'ok'; postgres$# end; postgres$# $$ postgres-# language plpgsql; CREATE FUNCTION postgres=# \timing Timing is on. postgres=# select md5_js(); md5_js -------- ok (1 row) Time: 11954.169 ms postgres=# select md5_js_select(); md5_js_select --------------- ok (1 row) Time: 39873.332 ms postgres=#
相差3陪,真的不敢相信
#log_parser_stats = on
#log_planner_stats = on
#log_executor_stats = on
#log_statement_stats = on
通过打开上面几个参数,收集相关信息到log里面,发现v_md5:=md5(random()::text);也是分解成select md5(random()::text)执行,但为什么相差这么大,希望有了解plpgsql函数调用的同学给预解答