Oracle 的存储过程或函数提供了两种执行方式:

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

KingbaseES plpgsql 通用也提供了编译执行方式,使得存储过程的执行效率大大提升。编译器只在第一次运行时进行编译,并加载到系统表 (pg_plpgsql_native_object)。我们来看以下例子:

1、创建存储过程

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;

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

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

5、结论:

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

2、只适用于plpgsql,对于 plsql 无效。后续版本会支持plsql 编译执行。

最新文章

  1. ★Kali信息收集★8.Nmap :端口扫描
  2. HTTP的长连接和短连接
  3. ng-controller event data
  4. 管理不同版本ruby和rails的利器——rvm
  5. Mtk Ft6306 touch 驱动 .
  6. Ioc和Aop扩展--多种方式实现依赖注入(构造注入,p命名空间注入,集合类型注入,注入null和注入空值)
  7. (转)Android属性设置android:noHistory="true"
  8. IT项目量化管理:细化、量化与图形化 与 中国IT项目实施困惑
  9. windows获取窗口句柄
  10. jquery动态添加/删除 tr/td
  11. UVA 11584 Paritioning by Palindromes(动态规划 回文)
  12. 手动修改VisualStudio IISExpress的配置
  13. [ArcGIS必打补丁]ArcGIS 10.1 SP1 for (Desktop, Engine, Server) Quality Improvement Patch
  14. [iOS]简单的APP引导页的实现 (Swift)
  15. Servlet的ClassLoader
  16. onclick = xxx这种赋值写法绑定事件的原理是什么?
  17. Servlet3.1上传图片示例
  18. Java多线程的调度策略
  19. [Python][Scrapy 框架] Python3 Scrapy的安装
  20. MySQL 约束、表连接、表关联、索引

热门文章

  1. RPA SAP财务内部对账机器人
  2. Linux YUM yum 命令详解
  3. vmstate 命令详解2022
  4. browserify的standalone的含义
  5. JDBCToolsV3 :DAO
  6. 选择结构-扩展if-else语句和练习用if语句实现考试成绩划分
  7. P2512 【一本通提高篇贪心】「一本通 1.1 练习 6」[HAOI2008]糖果传递
  8. Calendar类介绍_获取对象的方式和Calendar类的常用成员方式
  9. 20170622日行一记之PHP函数
  10. 论文解读(ChebyGIN)《Understanding Attention and Generalization in Graph Neural Networks》