享一个plpgsql中一个语句不同写法对于性能严重影响的问题(目前还找不到函数到底是怎样个调用法)-阿里云开发者社区

开发者社区> 数据库> 正文
登录阅读全文

享一个plpgsql中一个语句不同写法对于性能严重影响的问题(目前还找不到函数到底是怎样个调用法)

简介:

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章
最新文章
相关文章