您想学习调优 SQL PL 的一些技巧吗?如果是这样的话,本文将描述一些调优 IBM DB2 Universal Database(UDB)V8.2 for Linux,UNIX, and Windows 中的 SQL 过程的常见例子,并将特别关注从其他数据 库管理系统中移植过来的过程。动机
SQL 过程语言(SQL PL)是许多 DB2 开发人员工具箱中的一个流行工具。当将应用程序 从 Oracle、Sybase 或 Microsoft SQL 服务器迁移或移植到 DB2 中时,更是如此。然而,SQL PL 的即时可用性也给它带 来了一些问题:
首先,在许多开发人员的意识中,开发过程逻辑比编写 SQL 要容易得多。因此,虽然已经证明 DB2 是 带有最前沿优化器的关系引擎,但它并没有得到充分利用。
其次,诸如 Migration Tool Kit(MTK)之类的自动化工具 将生成对 T-SQL 或 PL/SQL 所创建逻辑的 SQL PL 模拟。众所周知,纯粹模拟的性能总是不如其原型。
在前面的文章中 ,我曾描述了分别利用 SQL PL Profiler 和 SQL 过程跟踪 来发现性能和逻辑问题。本文中,我将使用 SQL PL Profiler 来说 明一组慢速 SQL PL 的常见例子,并说明 DB2 V8.2 如何独自优化它们,或者您自己如何可以调优 SQL PL。
普通 SQL 过程
如果您有 Microsoft SQL Server 或 Sybase 方面的背景知识,那么您就会很好地了解这些过程。除了一条 CALL 语句 ,这个范例的应用程序中将不存在任何 SQL。通过这个范例所认识到的好处有两个:
首先是封装。例如,如果查询十分 复杂,就不应重复查询多次,而是应该将它存储在某一个地方。
其次是缓存。存储过程中的代码是预先编译的。而应用 程序中的代码通常是动态 代码。
为了解决第一个问题,DB2 支持内联 SQL PL 的概念。DB2 允许将简单逻辑或查询封装 在 SQL 函数中。当从调用者执行该 SQL 函数时,其主体就是扩展到调用者中的宏。
为了解决第二个问题,DB2 使用了 包缓存。该缓存不仅记住最近执行的过程,还记住了以前执行的语句。因此,在第一次编译 SQL 语句之后,后来的调用只要继 续执行相同的执行计划即可。我们用一个例子来说明:
1 CREATE PROCEDURE get_dept_emps(dept_id dept_id_t) 2 BEGIN 3 DECLARE cur CURSOR WITH RETURN FOR 4 SELECT emp_name, emp_id FROM emp 5 WHERE emp_dept_id = dept_id; 6 OPEN cur; 7 END
注意,您可以从“下载”小节中下载带有完全 DDL 的所有例子。可以从 developerWorks 下载本文 全文使用的 SQL PL Profiler。下面的屏幕快照展示了上述普通 SQL 过程的 100 次执行。
那么,时间消耗在哪些地方了呢?DB2 需要处理 这条 CALL 语句。假设以前已经缓存了这个过程,那么,DB2 就需要初始化 SQL 过程,以便执行它。然后,DB2 打开从过程中 返回的游标,并处理分配给结果集的定位器。最后,DB2 才可以真正取得所返回的行。做这么多工作仅仅是为了打开一个游标!
现在,让我们使用内联 SQL PL 来取得相同的效果:
1 CREATE FUNCTION get_dept_emps_f(dept_id dept_id_t) 2 RETURNS TABLE(emp_name name_t, 3 emp_id emp_id_t) 4 RETURN SELECT emp_name, emp_id 5 FROM emp 6 WHERE emp_dept_id = emp_dept_id;
我们现在用 DECLARE 游标及其各自的 OPEN 语句来替换驱动程序过 程中的 CALL 和所有定位器代码,并测试结果:
真是令人印象深刻!仅仅通过使用内联 SQL PL 就使所监控代码的运行速度提高了三倍。甚至连不返回结果集的简单 SQL 过程也可以用 SQL 函数取代。对于返回不止一个参数 的过程,可以使用 SQL 表函数,它返回一个包含一行的表 —— 每个输出参数为一列。对于包含一个输出的过程, 可以只使用一个标量 SQL 函数。注意,DB2 V8.2 还支持在 SQL 表函数中包含 UPDATE、DELETE、INSERT 和 MERGE。这意味着 您甚至可以使用内联 SQL PL 封装数据库更改。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索sql
, pl/sql
, 函数
, sql/pl developer
, db2
, mtk
, 内联函数
, 语句
, 游标调优
, pl sql连不上数据库
, pl sql存储过程
, 一个
, 过程
SQL调优
存储过程调优、oracle存储过程调优、sql性能调优培训、sql调优、sql性能调优,以便于您获取更多的相关知识。