享一个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函数调用的同学给预解答
目录
打赏
0
0
0
0
3
分享
相关文章
MySQL数据库——存储过程-if条件判断、参数、case(介绍、用法、案例)
MySQL数据库——存储过程-if条件判断、参数、case(介绍、用法、案例)
573 0
|
12月前
|
SQL
Greenplum【SQL 03】实现树结构+自定义函数+避免函数重复调用+ function cannot execute on a QE slice 问题处理(优化过程全记录)
Greenplum【SQL 03】实现树结构+自定义函数+避免函数重复调用+ function cannot execute on a QE slice 问题处理(优化过程全记录)
220 0
6.2 使用局部内部类优化代码:适用场景及注意事项
6.2 使用局部内部类优化代码:适用场景及注意事项
127 0
if~else语句的执行过程及几个数据与零值比较时的注意事项
if~else语句的执行过程及几个数据与零值比较时的注意事项
143 0
【Lua基础 第4章】Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
185 0
【Lua基础 第4章】Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
Vue中判断语句和循环语句的基础用法 v-if和v-for的注意事项
以下的内容让你了解vue中判断语句和循环语句的基础用法v-if和v-for的注意事项。
326 0
Vue中判断语句和循环语句的基础用法 v-if和v-for的注意事项
原生基础的判断语句中switch语句和if else if语句的区别
原生基础的判断语句中switch语句和if else if语句的区别
187 0
判断是否"存在",还在用count?试试这条SQL语句,性能杠杠的!
判断是否"存在",还在用count?试试这条SQL语句,性能杠杠的!
196 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等