plpgsql 编译执行
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 编译执行。
plpgsql 编译执行的更多相关文章
- C#编译执行过程
前言 大家好,我是卫斯理(Wesley).喜欢武侠的朋友可能知道小说中也有个卫斯理,他是位冒险家,财力充沛,极富冒险精神,并且有着超强的好奇心,对奇异的事情总有"打破沙锅问到底"的 ...
- 在cshtml页面中,以‘@’开始的表达式 表示C#语句,会被编译执行
在原始的Index.html中是正常显示的,然而在现在这个源代码是个cshtml页面: 但是在cshtml页面中,以‘@’开始的表达式 表示C#语句,会被编译执行,会去寻找controller传度给@ ...
- F# 既能解释执行,也能编译执行
F# 除了是函数式语言和面向对象语言之外,还有个突出的特点是:既能解释执行,也能编译执行. 一般说来,一种语言只能选择其一种.比如说C++.C#是编译执行,不能解释执行,象Matlab.R是解释执 ...
- C程序编译执行过程
C程序编译执行过程 认识C编译执行过程,是C学习的开端. 简单说C语言从编码编译到执行要经历一下过程: C源代码 编译---->形成目标代码,目标代码是在目标机器上运行的代码. 连接-- ...
- JAVA 文件编译执行与虚拟机(JVM)简单介绍
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...
- Linuxc - 多c文件程序编译执行
多文件使用,一起编译 定义max.h int max(int a,int b); 定义max.c #include "max.h" int max(int a,int b) { i ...
- jvm的解释执行与编译执行
1.原理 字节码无法直接交给硬件执行需要虚拟机翻译成机器码才能执行,“翻译”的策略有两种:解释执行和编译执行又称即使编译(JIT).解释执行是没执行一句字节码的时候把字节码翻译成机器码并执行,优点是启 ...
- JVM总括三-字节码、字节码指令、JIT编译执行
JVM总括三-字节码.字节码指令.JIT编译执行 目录:JVM总括:目录 java文件编译后的class文件,java跨平台的中间层,JVM通过对字节码的解释执行(执行模式,还有JIT编译执行,下面讲 ...
- “Java是编译执行的语言”这句话对吗?
现在让你谈谈对Java平台的理解,你是否会感觉内容过于庞大?这个问题是比较宽泛的,Java发展到现在已经不仅仅是语言这么简单了,Java平台涉及的,包括但不仅限于下面提到的这些内容: Java语言本身 ...
随机推荐
- cve_2019_0708_bluekeep漏洞
一.环境说明 kali linux windows 7 sp1 二.cve_2019_0708_bluekeep漏洞利用 msf5 auxiliary(dos/windows/rdp/ms12_020 ...
- 抓到Dubbo异步调用的小BUG,再送你一个贡献开源代码的机会
hello,大家好呀,我是小楼. 最近一个技术群有同学at我,问我是否熟悉Dubbo,这我熟啊~ 他说遇到了一个Dubbo异步调用的问题,怀疑是个BUG,提到BUG我可就不困了,说不定可以水,哦不.. ...
- Pytorch从0开始实现YOLO V3指南 part5——设计输入和输出的流程
本节翻译自:https://blog.paperspace.com/how-to-implement-a-yolo-v3-object-detector-from-scratch-in-pytorch ...
- 拥抱云原生 2.0 时代,Tapdata 入选阿里云首期云原生加速器!
3月9日,阿里云首期云原生加速器官宣,Tapdata 突出重围,成功入选31 强,将与多家行业知名企业,携手阿里云共建云原生行业新生态,加速拥抱云原生新时代的无限潜能. 2021年,阿里云正式 ...
- do-while循环和三种循环的区别
循环语句3--do...while do...while循环格式 初始化表达式① do{ 循环体③ 步进表达式④ }while(布尔表达式②); 执行流程 执行顺序:①③④>②③④>②③④ ...
- 【python笔记】Qt+云函数 实现简单的登录框制作
[python笔记]Qt+云函数 实现简单的登录框制作 备注:前置条件:QtDesigner.pycharm.PyQt5.配置好的云函数(百度的叫函数计算CFC,用来充当一个简陋的服务器,主要是免费) ...
- vue 调用nginx服务跨越的问题
server { listen 80; server_name api.xxxx.com; add_header Access-Control-Allow-Origin '*' ; proxy_set ...
- freeswitch的话单模块
概述 最近因为业务需要,在看freeswitch中话单相关的一些模块. 在voip的使用过程中,话单是重要的基础模块,涉及到计费和问题查找. 呼叫话单最重要的一点是稳定,不能有错误或遗漏. 本章对fs ...
- CMU15445 (Fall 2019) 之 Project#4 - Logging & Recovery 详解
前言 这是 Fall 2019 的最后一个实验,要求我们实现预写式日志.系统恢复和存档点功能,这三个功能分别对应三个类 LogManager.LogRecovery 和 CheckpointManag ...
- led跑马灯(模糊时钟ambiguous color,非法字符 non printable character,寄存器初值,计数器计数注意事项)
1.设计定义 让8个led以100ns的速度循环闪烁. 2.设计输入 循环闪烁,还是周期问题,用时钟驱动,所以需要一个时钟信号clk.再给一个复位输入reset,八个输出led信号. 每100ns只有 ...