享一个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函数调用的同学给预解答
相关文章
|
2月前
|
Python
#PY小贴士# for 循环定义的变量,循环外可以用吗?
我们知道,在 python 中要获取一个变量的值,必须是先给它赋值过,不然就是未定义。那么这个 i,代码中没有显式的赋值,在循环体之外还可以用吗?
feof用法重点详解(易被误用判断文件结束!!!)
feof用法重点详解(易被误用判断文件结束!!!)
|
缓存 前端开发
【前端三分钟】优化判断语句
【前端三分钟】优化判断语句
115 0
|
缓存 API
如何写出高质量的代码 data 组件 函数 注释 命名 变量的次数
如何写出高质量的代码 data 组件 函数 注释 命名 变量的次数
|
程序员 索引
for 循环的 5 种写法,哪种最快?
几种遍历方法中for执行最快,它没有任何额外的函数调用栈和上下文。但在实际开发中我们要结合语义话、可读性和程序性能,去选择究竟使用哪种方案。下面来看for , foreach , map , for...in , for...of五种方法现场battle。
for循环执行的速度快于其内部的点击响应函数
for循环执行的速度快于其内部的点击响应函数
73 0
for循环执行的速度快于其内部的点击响应函数
|
Python
函数注意事项
# 函数的位置参数必须要传实参,可以按位置,也可以按关键字传 # 函数的默认参数可以不传实参,可以按位置,也可以按关键字 # 不定长参数*args只收集位置参数形成元组,不定长参数应放在后面,要不会把实参当做位置参数然后报错 # 用**,只要定义了关键字参数,以后针对这个参数传值就必须是关键字形式...
905 0
推荐文章
更多