调优SQL过程 - 面向对象网,数据库,db2,学习,对象 - 面向对象技术开发

面向对象技术开发

会员投稿 投稿指南 站长资讯通告:
您的位置: 首页 > 数据库 > db2教程 > 正文

调优SQL过程

来源: www.bianceng.cn 阅读:

您想学习调优 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 封装数据库更改。

Tags:
相关文章列表: