《PLPGSQL基本原理与兼容Oracle最佳实践(16页).pdf》由会员分享,可在线阅读,更多相关《PLPGSQL基本原理与兼容Oracle最佳实践(16页).pdf(16页珍藏版)》请在三个皮匠报告上搜索。
1、PL/PGSQL基本原理与兼容Oracle最佳实践阿里云智能事业群-数据库产品事业部-张扬p简介p整体架构p变量处理与表达式计算p事务行为p异常p多级缓存p兼容Oracle最佳实践主要内容简介概念可加载程序语言。SQL语言的扩充。对标Oracle的PL/SQL优势 实现复杂的业务逻辑。降低网络延迟。避免多轮查询解析,优化性能。重要性 使用普遍,传统金融、保险等行业广泛依赖其实现后端逻辑。基础架构基本框架解释型架构。有编译器/执行器,无优化器。工作在SQL引擎上层。只处理控制语句,依赖SQL引擎处理实际的增删改查、表达式计算等功能。变量处理与表达式计算变量处理(编译阶段)PL/PGSQL的sca
2、nner和parser负责识别变量语义。DECLARE段parse阶段创建出变量的namespace栈。BEGIN/END块parse阶段查找栈将变量和普通表/列/关键字语义区分开。变量处理与表达式计算变量处理(执行阶段)通过在编译器/优化器/执行器不同阶段设置回调函数处理。回调函数回到PL引擎,从命名栈查找变量并返回SQL引擎。在优化器/执行器中统一表示为param节点,处理逻辑与带参数的cursor/prepared_stmt一致。变量处理与表达式计算表达式处理所有表达式和SQL语句的计算和执行均丢给SQL层处理。简单表达式:缓存其ExprContext,多次执行时可以直接调用执行器计算结
3、果。复杂表达式:计算expr_a等同于执行select expr_a;语句:pl块内执行任意SQL语句等效于执行prepared statement。事务行为异常异常PL的exception机制通过set_jump,long_jump结合子事务实现。带exception的pl块默认运行在子事务中。事务控制与异常相关,带exception的pl块内无法进行事务控制。多级缓存兼容Oracle最佳实践事务行为差异(事务控制)参考上文事务控制章节,PL/PGSQL仅在非原子上下文允许进行事务控制。右侧是Oracle中常见写法,在PL/PGSQL中执行,t1中不会成功插入任何数据。方案:对于需要执行事务
4、控制的存储过程,使用匿名块或procedure而非函数。兼容Oracle最佳实践事务行为差异(异常回滚)PL/PGSQL暂不支持语句级回滚,出错回滚时,所有未能显式commit的修改将丢失。右侧存储过程在Oracle中执行后表中将有前两条数据,PL/PGSQL中执行则不会有任何数据插入成功。方案:长时间执行的大事务根据需求适当进行显式提交,如循环指定次数后commit一次,可有效避免提交丢失。兼容Oracle最佳实践动态Record导致执行计划失效与Oracle不同,PL/PGSQL的record类型可以绑定任意表的rowtype,编译期间不做校验。存储过程中使用%rowtype后对相关表做D
5、DL,执行计划不会失效。右侧存储过程第二次调用会出错,因为此时执行计划已过期。方案:需要频繁修改的表或视图尽量避免在存储过程中将record绑定到其rowtype上。兼容Oracle最佳实践游标生命周期不一致PL/PGSQL的游标生命周期仅存在单个事务内部。Commit/rollback等事务控制语句会结束当前事务并开启新事务,因此会导致已打开的游标被清除。右侧存储过程在Oracle中执行正常,PL/PGSQL中第二次fetch会出错,此时游标已不存在。方案:避免在提交或回滚后操作之前打开的游标。兼容Oracle最佳实践更多的兼容性问题如何在PL/PGSQL中使用PL/SQL里的集合类型?包功能不支持/大量内置包找不到有效替代品?想使用批处理语句优化性能减少大量的循环开销?语法差异大,大量业务代码需要修改如何解决?等等PolarDB for PG Oracle兼容版提供业界最好的兼容能力,助力业务无缝迁移,平滑去O。