享一个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函数调用的同学给预解答
相关文章
|
5月前
|
数据库连接 Go 开发者
避免defer陷阱:拆解延迟语句,掌握正确使用方法
避免defer陷阱:拆解延迟语句,掌握正确使用方法
|
5月前
|
存储 安全 C++
【C++14保姆级教程】lambda 初始化捕获 new/delete 消除
【C++14保姆级教程】lambda 初始化捕获 new/delete 消除
247 0
|
5月前
|
SQL
Greenplum【SQL 03】实现树结构+自定义函数+避免函数重复调用+ function cannot execute on a QE slice 问题处理(优化过程全记录)
Greenplum【SQL 03】实现树结构+自定义函数+避免函数重复调用+ function cannot execute on a QE slice 问题处理(优化过程全记录)
136 0
|
C++
[✔️]c++返回2个值给lua,tolua如何处理c++函数重载
[✔️]c++返回2个值给lua,tolua如何处理c++函数重载
129 0
|
JSON 数据处理 数据格式
🌮微卷不亏,4 分钟优化 Fetch 函数写法~
上一篇介绍了啥叫“微卷不亏”,今天继续简单微卷一些小知识点:本篇带来《如何优化 Fetch 函数写法》,轻松拿下~
|
XML Java 数据格式
【Lua基础 第4章】Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
145 0
【Lua基础 第4章】Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
|
JavaScript 前端开发 Java
原生基础的判断语句中switch语句和if else if语句的区别
原生基础的判断语句中switch语句和if else if语句的区别
124 0
|
Web App开发 JavaScript 前端开发
计算Javascript 指定语句执行时间的两种办法
Created by Jerry Wang, last modified on Sep 27, 2014
计算Javascript 指定语句执行时间的两种办法
|
SQL Java 程序员
判断是否"存在",还在用count?试试这条SQL语句,性能杠杠的!
判断是否"存在",还在用count?试试这条SQL语句,性能杠杠的!
171 0
|
SQL 架构师 关系型数据库
同一个SQL语句,为啥性能差异咋就这么大呢?(1分钟系列)
今天花1分钟简单说下,常见的type结果及代表的含义,并且通过同一个SQL语句的性能差异,说明建对索引多么重要。
539 0
同一个SQL语句,为啥性能差异咋就这么大呢?(1分钟系列)