最近在测试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函数调用的同学给预解答