WEB开发网
开发学院数据库DB2 SQL过程的性能:提示和技巧 阅读

SQL过程的性能:提示和技巧

 2009-12-12 14:59:16 来源:WEB开发网   
核心提示:使用用于临时数据的临时表在 V7 中,DB2 引入了临时表,SQL过程的性能:提示和技巧(4),对临时表的操作通常比对常规表的操作快,让我们看一些原因:首先,然后请确保应用程序中一些关键查询的方案是合适的,最后,临时表的创建不会涉及向目录中插入项,并且临时表的使用也不会涉及对目录的访问;因此

使用用于临时数据的临时表

在 V7 中,DB2 引入了临时表。对临时表的操作通常比对常规表的操作快。让我们看一些原因:

首先,临时表的创建不会涉及向目录中插入项,并且临时表的使用也不会涉及对目录的访问;因此,不会有目录争用问题。

因为临时表只能由创建它们的应用程序访问,因此在其操作中不会涉及锁定问题。

如果指定了 NOT LOGGED 选项,则不对临时表上的操作记录日志(当然,这样就不可能回滚更改)。因此,如果您的存储过程生成了大量临时数据,并只打算在数据库的一个会话中使用它们,那么请将这些数据存储进临时表,这样可以显著地改进性能。

在对 SQL 过程中的临时表进行任何应用之前,表定义在编译环境中必须是可用的。例如,在下面的 CLP 脚本(该脚本使用“%”作为语句的终结符)中,表定义的唯一目的就是能够创建 SQL 过程:

CONNECT TO sample %
DECLARE GLOBAL TEMPORARY TABLE TT(C1 INT, C2 CHAR(20)) %
CREATE PROCEDURE INSTT(P1 INT, P2 CHAR(20))
BEGIN
INSERT INTO SESSION.TT VALUES(P1, P2);
END %
CONNECT RESET %

在执行了 CONNECT RESET 命令后,临时表将不复存在。在运行时,应用程序必须确保在执行使用临时表的首个查询之前该表是存在的。最后的这个观察引出了一个我们从未提及的要点:引用临时表的任何查询都将被动态地编译,即使该查询被写成静态的 SQL。跟其它任何动态查询一样,在编译该查询之后,它将以已编译的形式保留在包高速缓存中。在下一次执行相同的查询时,仅当无法在高速缓存发现它时,DB2 才重新编译它。

如果您打算创建相对较大的临时表,并对这些表运行几个查询,请考虑定义索引并对它们运行 runstats(显然后者是填充了表后进行的)。 下一节将介绍更多这方面的内容。

有关在 SQL 过程中使用临时表的最后一个说明是:如果需要根据在同一个过程中创建的临时表返回结果集,那么必须在嵌套的复合语句中定义结果集,如下面的示例所示:

CREATE PROCEDURE INSTT2(P1 INT, P2 CHAR(20))
BEGIN
DECLARE GLOBAL TEMPORARY TABLE TT(C1 INT, C2 CHAR(20)) %
INSERT INTO SESSION.TT VALUES(P1, P2);
BEGIN
DECLARE C1 CURSOR WITH RETURN FOR SELECT * FROM SESSION.TT;
END;
END %

必须在嵌套的复合语句中定义结果集的理由是,DECLARE GLOBAL TEMPORARY TABLE 是一个可执行语句,而可执行语句只能在声明语句(例如 DECLARE CURSOR)之后编写。如果我们在游标定义之后在外部作用域中声明表,那么当编译 DECLARE CURSOR 语句时,该表在编译环境中将不可用,因此编译会失败。

保持 DB2 优化器处于被通知状态

当创建了一个过程时,其单独的 SQL 查询被编译成包中的节。其中,DB2 优化器根据表的统计信息(例如,表大小或某列中数据值出现的相对频率)以及编译查询时可用的索引来选择查询的执行方案。当表经过了重大更改时,让 DB2 再次收集有关这些表的统计信息可能是个好主意。当更新了统计信息时,或者当创建了新的索引时,重新绑定那些与使用表的 SQL 过程相关联的包,以使 DB2 创建使用最新统计信息和索引的方案,这可能也是一个好主意。

可以使用 RUNSTATS 命令更新表的统计信息。要重新绑定与 SQL 过程关联的包,可以使用 REBIND_ROUTINE_PACKAGE 内置过程(在 DB2 V8 中可用)。例如,可以使用下面这条命令来重新绑定过程 MYSCHEMA.MYPROC 的包:

CALL SYSPROC.REBIND_ROUTINE_PACKAGE('P', 'MYSCHEMA.MYPROC', 'ANY')

其中 'P' 表明该包对应于一个过程,而 'ANY' 表明 SQL 路径中的任何函数和类型都被当作函数和类型解析。

结束语

在本文中,我提供了一类可能有助于改进 SQL 过程的性能的提示和技巧(请查阅 Yip等编写的书籍,以获取 SQL PL 的良好简介)。作为一般规则,首先考虑系统性能(硬件和 OS)和数据库管理器(缓冲池、容器和表空间等等)这些基本的问题。DB2 配置顾问程序对于后者非常有帮助。然后请确保应用程序中一些关键查询的方案是合适的。最后,利用本文提供的建议来研究改进您的存储过程和应用程序。祝您在调优的工作中好运!

上一页  1 2 3 4 

Tags:SQL 过程 性能

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接