PL/SQL的那些事儿
Kaya发表于os2ora.com
PL/SQL是Oracle对SQL的过程化扩展,是Oracle数据库内部直接支持的语言。甚至,管理数据库的API接口都是以PL/SQL存储过程的方式提供的,耳熟能详的诸如收集统计信息,打印执行计划等等。
PL/SQL除了与SQL语言无缝衔接之外,还具有所有过程化强类型语言的一切特征,如变量/过程/函数的定义,一般的控制结构,异常处理等等。很多生产系统上也普遍使用着PL/SQL,这有两类场景。
第一类场景,PL/SQL的作用主要是把一系列的统计分析类型的SQL串起来,这中间会用到一些中间表做为数据处理的过渡。系统的主要执行时间主要还是花在SQL的执行上。
另一类场景,PL/SQL的作用在于对数据进行处理,使用游标从数据库中获取数据,之后使用PL/SQL的循环结构依次处理每行记录。当然,为了提高性能,一般会用到bulk批量操作。
集合操作minus, intersect
半连接,反连接exists, not exists
窗口函数
多表插入
外连接
分析函数
PL/SQL函数
等等
在买了强劲的机器后,一般大家就开始对这两类场景进行优化。结果是显而易见的,不管第二类场景如何优化,系统的性能就是上不去,而把第二类场景使用第一类场景的方法重写后,性能一般就会有成百上千倍的提升。
从中得到的一个结论就是,能够使用SQL完成的事情,就不要自己通过过程化语言(Java和PL/SQL本质上是一样的)实现。SQL引擎是一个数据库最核心的部件,要好好加以利用。SQL语法无比强大,很多数据转换逻辑可以通过下面的技术通过SQL加以实现:
当然,PL/SQL也有其重要的作用,比如前面提到的,很多管理数据库的接口都以PL/SQL的方式提供。另外,很多对数据库的监控工具也都使用PL/SQL部署在数据库内部。这很容易理解,打个类比,为了监控操作系统的性能,一种方法是把监控脚本直接部署在被监控的主机上,另一种是通过网络定时登录到被监控主机上执行监控命令。第一种方式的效率当然会比第二种方式高,它避免了每次的登录开销,还有,可以更加精确地对性能计数器的数据进行统计,如求平均值。平均值等于两个时刻的计数器值的差除以两个时刻之间的间隔,当然,时刻的表示最好与性能计数器在同个服务器上。监控数据库是一样的原理,直接运行在数据库内部的PL/SQL对数据库的监控会有得天独厚的优势。
值得推荐的以PL/SQL写就的一个性能监控分析工具是Tanel所写的Session Snapper。
Snapper is meant to be a quick and easy ad-hoc performance troubleshooting tool for the field-DBAs out there who have to get their hands on and dirty whenever a database problem happens (and fix the problem fast!). It is meant to be a flexible first round performance troubleshooting tool, an entry point tool for troubleshooting, something which you can easily run in couple of seconds instead of having to immediately resort to heavier operations such as SQL tracing. Note that Snapper does not perform any magic for you. It does not make any smart performance recommendations or offer any tuning advice. All it does (and does well) is presenting the facts. It will take snapshots from views like V$SESSTAT and a few more and show you how much some performance counter incremented for a session during the snapshot period. Snapper v3 will additionally show you a TOP report of active V$SESSION samples taken during the snapshot period, just like ASH does. Here are couple of important things about Snapper: Snapper does not create any objects in the database Snapper is just an anonymous PL/SQL block, parsed and compiled on the fly Snapper requires no change whatsoever in the database schema or settings!
另外,可以通过SQL调用PL/SQL函数,以扩展SQL的功能,这当然也打开了众多的可能性。最一般的情况是把PL/SQL函数当做一般SQL函数的扩展,出现在SELECT子句和WHERE子句中。
还有一类函数叫做Table Function,它的返回结果是一个”表“,一个大家熟悉的例子:
select * from table(dbms_xplan.display());
dbms_xplan.display就是一个Table Function。
Table Function还有众多特性,如用来做ETL,数据卸载。这里就先不展开了。
嗯,PL/SQL是一把宝剑,很锋利,但也不要拿它当菜刀。
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Kaya 来源: OS与Oracle
- 标签: PL
- 发布时间:2013-06-09 13:16:28
- [71] Twitter/微博客的学习摘要
- [65] find命令的一点注意事项
- [65] IOS安全–浅谈关于IOS加固的几种方法
- [63] android 开发入门
- [62] Go Reflect 性能
- [62] 如何拿下简短的域名
- [61] Oracle MTS模式下 进程地址与会话信
- [60] 流程管理与用户研究
- [57] 图书馆的世界纪录
- [57] 读书笔记-壹百度:百度十年千倍的29条法则