所以 PL/SQL 是 SQL 的扩展,而不是它的替代品。在大多数情况下,纯 SQL 解决方案的性能将优于由 SQL 和 PL/SQL 组合而成的
解决方案。请记住,数据库旨在处理数据集。一旦您开始以逐行(或缓慢)的方式处理数据,您就停止了数据库做它最擅长的事情。
考虑到这一点,PL/SQL 程序员的目标应该是成为懂一点 PL/SQL 的 SQL 专家,而不是懂一点 SQL 的 PL/SQL 专家。
在过去的 20 年中,SQL 有了很大的发展。分析函数和 SQL/XML
等特性的引入意味着您可以直接从 SQL 执行非常复杂的任务。以
下几点描述了人们在 SQL 更合适时使用 PL/SQL 的一些常见情况。
UTL_FILE 如果可以外部表,请停止使用读取文本文件。使用 UTL_FILE 包从平面文件中读取数据效率非常低。自 Oracle 7 以
来,人们一直在使用 SQL*Loader 来提高性能,但从 Oracle 9i 开始,推荐的从平面文件读取数据的方法是使用外部表。默
认情况下不仅效率更高,而且它很容易并行读取数据,并允许预处理器命令在读取文件之前执行诸如动态解压缩文件之类的任
务。在许多情况下,您的 PL/SQL 加载过程可以用一条 INSERT ... SELECT 语句替换,该语句的数据来源于外部表。
如果可以使用 MERGE 语句 ,请停止编写 PL/SQL 合并。使用 PL/SQL 合并或更新大量数据是对资源的严重浪费。相反,您
应该使用该 MERGE 语句在单个 DML 语句中执行操作。它不仅更快,而且看起来更简单,并且很容易并行运行。
停止手动编码多表插入。当一个动作可以在单个多表插入中执行时,为什么要向服务器发送多个 DML 语句?由于 Oracle 9i
多表插入提供了一种灵活的方式来减少到服务器的往返次数。
当您可以使用
DML 错误记录 ( DBMS_ERRLOG) 来捕获 DML 中的故障时,请停止使用批量绑定 (FORALL) 。在某些情况下,最
明显的问题解决方案是 DML 语句(INSERT ... SELECT、UPDATE、DELETE),但您可以选择避免 DML,因为它对异常的
反应方式。默认情况下,如果 DML 语句中的单行引发异常,则该 DML 语句完成的所有工作都会回滚。在过去,这意味着在
逻辑上是影响多行的单个 DML 语句的操作必须使用 FORALL ... SAVE EXCEPTIONS 构造,因为担心单个异常会破坏整个过程。
Oracle 10g 第 2 版引入了 DML 错误日志记录,允许我们恢复使用单个 DML 语句来替换不必要的批量绑定操作。
评论