暂无图片
暂无图片
8
暂无图片
暂无图片
暂无图片

知识点滴 -- KingbaseES 函数编译执行

原创 金仓数据库 2023-08-08
24927

KingbaseES 支持两种过程块解析器:兼容Oracle的plsql解析器与兼容PostgreSQL 的plpgsql 解析器。针对plpgsql解析器,KingbaseES支持编译执行与解释执行两种模式,两种模式在执行效率上差距很大:

  • 解释执行:将源代码逐条转换成目标代码,解释一条,执行一条的过程。plpgsql 将语句翻译成中间形式的系统代码,并在运行时进行解释。
  • 编译执行:将源代码一次性转换成目标代码,然后执行目标代码的过程。plpgsql 将语句编译成动态库并存储在catalog中,运行时无须进行解释,运行速度更快。

plpgsql 编译器只在第一次运行时进行编译,并加载到系统表 (pg_plpgsql_native_object)。我们来看以下例子:

1、创建存储过程

注意:在创建存储过程前,必须先设置 set plpgsql.enable_native_code=on; 否则创建存储过程不是编译执行的。

create or replace function caln( n integer ) returns bigint as $$
declare 
  v_total bigint;
begin
  v_total :=0;
  for i in 1..n loop
     v_total := v_total + i;
  end loop;
  return v_total;  
end;
$$ language plpgsql;

创建存储过程后,可以在pg_plpgsql_native_object 看到相关信息。如果是非编译执行的,则不会显示在视图 pg_plpgsql_native_object 。

2、PostgreSQL 执行情况

testdb=# \timing on
Timing is on.
testdb=# select caln(10000000); 
      caln      
----------------
 50000005000000
(1 row)

Time: 2000.733 ms (00:02.001)

3、KingbaseES 执行情况

正常情况下执行效率:

test=# \timing on
Timing is on.
test=# select caln(10000000);    
      caln      
----------------
 50000005000000
(1 row)

Time: 1954.474 ms (00:01.954)

启用编译执行:

test=# set plpgsql.enable_native_code=on;
SET
Time: 0.240 ms
test=# select caln(10000000);            
      caln      
----------------
 50000005000000
(1 row)

Time: 130.605 ms

注意:即使函数创建时 plpgsql.enable_native_code=on ,在执行也必须设置 set plpgsql.enable_native_code=on。

4、对于执行大量SQL的效果

例子:

create or replace procedure proc01 as
$$
declare
  cnt integer;
begin
  for i in 1..1000000 loop
    select count(*) into cnt from t1;
  end loop;                                     
end;
$$ language plpgsql

执行结果:

test=# call proc01();                                                                                               
CALL
Time: 6198.621 ms (00:06.199)
test=# set plpgsql.enable_native_code=on;
SET
Time: 0.529 ms
test=# call proc01();                    
CALL
Time: 304.246 ms

注:本例 t1 表是非常小的,也就是说SQL的执行时间很快,大部分耗在SQL解析上。

5、结论:

1、plpgsql 的编译执行会有很大的性能提升,特别是主要消耗在SQL解析或运算上的过程。对于大量时间消耗在SQL 执行上的过程,则提升不大。

2、只适用于plpgsql,当前还不支撑 plsql 编译执行。后续KingbaesES版本会支持plsql 编译执行。

最后修改时间:2024-08-20 16:43:45
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论