技术开发 频道

达梦数据库7.0版新特性之PL_SQL介绍

  DM7计划执行流程如下:

  1、构造虚拟机VM,生成堆栈,压入语句参数。

  2、对应方法信息构造执行栈帧(STACK FRAME)。栈帧是VM运行机制中的重要元素,它可以看作是方法的实例化对象。用以记录方法运行时的环境。

  3、加载METHOD的指令流,开始执行。

  4、NSQL是一个特殊的指令,这个指令负责执行一个SQL物理计划。它找到对应的操作符树,对应生成运行环境树,然后将VM的运行指针IP转移到操作符树根,开始执行该物理计划。计划执行完成后,IP被置向NSQL的下一条指令继续执行。

  5、在SQL物理计划执行过程中,如果当前执行操作符需要进行数据计算,则又会加载执行其计算指令流,待计算完成后继续转回操作符执行。

  6、过程/函数调用指令INV找到该函数执行计划的METHOD,为其构造新的栈帧,并转入其执行环境中执行。

  7、返回指令RTN将当前栈帧销毁,向堆栈填入返回值(如果有),并返回上层栈帧执行。图3.1表示的是虚拟机的执行过程:

达梦数据库7.0版新特性之PL_SQL介绍
▲图3.1 虚拟机执行示意图

  图3.2表示的是对表在PL/SQL中存在的SQL语句的执行过程,先根据NSQL的左孩子节点构造运行环境树,然后在每个树节点中都构造子VM通过VM的状态转移来控制执行步骤,递归执行完以NSQL为根节点的指令后一条SQL语句就相应执行完成。

达梦数据库7.0版新特性之PL_SQL介绍
▲图3.2 NSQL指令执行示意图

  图3.3表示的是函数/过程指令的执行过程,系统首先会从INV中找到对应的方法,然后构造新的栈桢,并将IP设置为新栈桢的开始位置,然后执行对应的指令流,执行完成后删除其栈桢并且还原IP,这样一个过程/函数的指令就执行完成。

达梦数据库7.0版新特性之PL_SQL介绍
▲图3.3 过程/函数指令执行示意图

  图3.4表示的是一个完成的VM执行从开始到结束的示意图,可以看出对于简单的常规指令,执行是比较简单的,只是做很小的操作即可完成,对于过程/函数这样的指令,系统还需要找到对应的既定义函数来执行,执行完成后再返回到虚拟机执行中;对于NSQL指令的执行可以看出,它会在执行时构造一棵环境树,执行时会递归执行内部的每个节点,每个子节点执行完成会返回到其父节点中,当所有节点都完成后会再回到NSQL指令,这样就可以返回到虚拟机的指令流中继续执行下一个指令了。

达梦数据库7.0版新特性之PL_SQL介绍
▲图3.4 虚拟机执行示意图

  DM7面向堆栈的虚拟机执行器,可以在指令与操作符间平滑地切换执行,也能够轻松地实现过程/函数的调用。借助简单高效的指令系统,以及直观快速的堆栈数据传输机制,可以有效提升SQL脚本或过程/函数的执行效率。

  DM7中分析PL/SQL时都是将语句块中的每条语句都分解成一个个的原子操作,象一个编译器一样将语句块分解为很多的指令流。对于语句块中嵌入的SQL语句,会生成一个NSQL指令,这样就会转去执行相应的操作符。对于语句块中嵌入的内部函数、存储过程或者函数都生成一个INV的指令,然后再转去执行真正的被调用体。而对于简单的运算操作,因为VM的执行是通过栈模型来操作的,所以执行是原子性的将操作数入栈,再根据具体的操作符来完成运算,再将结果压入栈中。

  从上面的虚拟机执行过程可以看出,PL/SQL的执行是非常高效的,完全可以把它理解为JAVA语言运行在JAVA虚拟机上。

0
相关文章