YashanDB PL 引擎
本文内容来自 YashanDB 官网,原文内容请见https://doc.yashandb.com/yashandb/23.3/zh/概念手册/YashanDB体系架构/PL引擎.html
PL 引擎为用户提供了过程化语言编程的平台,基于 SQL 语言扩展过程化能力,包括条件分支、循环,并实现了自定义的过程、函数等,提供了强大的编程能力。
PL 的主要优势有:
提升性能,当应用处理逻辑靠近数据后,能极大减少客户端和服务端的交互次数,显著降低执行的响应时间。
提升开发效率,应用开发时,可以把数据处理的逻辑封装成高内聚低耦合的存储过程或函数接口,共享给多个模块使用。
易于调优,随着数据量的增长,数据库的性能问题会逐步浮现甚至突然爆发,如果数据访问处理相关的逻辑都在存储过程中实现,DBA 能较快识别问题并通过优化 PL 代码立即干预。
#过程体
过程体是过程化语言的最主要载体,当前支持的过程体类型包括:
匿名块
匿名块是数据库里的一种特殊的 PL 对象,不会被持久化,创建后立即运行。它没有对象名字,不能直接按对象名调用。
存储过程
存储过程是 PL 语言按过程进行组织的数据库对象形式,类似 Pascal(结构化编程语言)中的过程。
自定义函数
自定义函数是 PL 语言按函数进行组织的数据库对象形式,简称 UDF,类似 Pascal(结构化编程语言)中的函数。自定义函数包括 PL 语言的自定义函数、外置 JAVA 语言的自定义函数和外置 C 语言的自定义函数。
触发器
触发器(TRIGGER)是数据库里的一种 PL 对象。创建一个触发器即创建了一个可执行的过程体,但触发器过程体不可以被用户显式调用,只能由一个事件来启动运行,当某个事件发生时触发器会自动隐式运行。
自定义高级包
自定义高级包是数据库里的一种 PL 对象,简称 UDP。自定义高级包是一组相关的过程、函数、变量、游标和类型等的集合。
自定义类型
自定义类型(UDT,User Defined Type),相对于数据库内置的类型而言,是由用户定义的数据类型,用于将现实世界的实体建模为数据库中的对象。UDT 与面向对象的编程思想类似,UDT 包含一组属性和方法,用户可以基于数据库内置的基本类型和其他 UDT 类型创建新的 UDT。
定时任务
定时任务(JOB)是一个根据时间定时触发执行的后台任务。一个定时任务包含如下三个基本要素:JOB 唯一标识、JOB 需要执行的任务、JOB 执行时间及频率。基于这三个要素,提供一系列 PL 语言的过程实现对一个 JOB 的直接操作管理。
#编译与执行
PL 的使用包括编译和执行两个阶段:
编译阶段:将客户端发送的 PL 文本进行词法分析、语法分析得到语义,然后进行基本的合法性校验以及一些必要的优化,此外 PL 中的 SQL 语句部分还需要调用 SQL 引擎的接口进行解析、校验和优化,最终得到可执行的 PL 对象,并缓存在 PL 池(匿名块例外,匿名块会缓存在 SQL 池)。
执行阶段:在执行阶段,如果在 PL 池命中发现可执行的 PL 对象,将直接执行该对象并返回结果。
评论