用户指南

应用程序设计

创建应用程序时,可以几种方法来改进性能,包括:

复合 SQL 和存储过程

对于发送和接收很多命令和答复的应用程序, 网络开销可能十分大。复合 SQL 和存储过程是两种减少此开销的办法。

如果应用程序发送数个 SQL 语句而不影响程序设计逻辑, 则可使用复合 SQL。如果在 SQL 语句组内需要程序设计逻辑, 则可使用存储过程。

所有可执行语句(下列语句除外)可包含在“复合 SQL”语句中:

       CALL                                                    
       FETCH                                                   
       CLOSE                                                   
       OPEN                                                    
       Compound SQL                                            
       Connect                                                 
       Prepare                                                 
       Release                                                 
       Describe                                                
       Rollback                                                
       Disconnect                                              
       Set connection                                          
       execute immediate                                       

有关详情,参考 SQL Reference

有关在应用程序中使用复合 SQL 的信息,参见NOT ATOMIC 复合 SQL。 有关将复合 SQL 与调入实用程序配合使用的信息,参见使用调入和调出实用程序

通过在服务器上放置程序逻辑,存储过程有助于减少网络通信量。 在 DB2 版本 5.0 之前的版本中,存储过程仅可返回输出参数, 且必须由应用程序来发出单独的落实命令。 这产生了两个网络进程。在 DB2 版本 5.0 及更高版本中, 可在退出过程时自动落实。还可返回结果集, 它使客户机上的应用程序逻辑最小化。

有关使用存储过程的信息,参见存储过程

分组请求

将相关的数据库请求(SQL 语句)分组为一个数据库请求可减少 在网络中传送的请求和响应数。 例如,将下列语句:

   SELECT COL1, COL2, COL5, COL6 FROM TABLEA WHERE ROW_ID=1
   SELECT COL1, COL2, COL5, COL6 FROM TABLEA WHERE ROW_ID=2

分组为

   SELECT COL1, COL2, COL5, COL6 FROM TABLEA WHERE ROW_ID=1 OR ROW_ID=2

可使网络中的请求数目少一些。

还可使用诸如 IN 和 BETWEEN 之类的关键字,以减少返回的行数。 此外,还可在 UPDATE 和 DELETE 语句上使用 WHERE、IN 和 BETWEEN 关键字。

谓词逻辑

可使用谓词逻辑来仅请求需要的行和列。 这使得数据传送的网络通信量和 CPU 额外开销最小化。

例如,不要使用查询:

   SELECT * FROM TABLEA

(仅当的确需要 ROW_ID 为 1 的 TABLEA 的第一行时或仅当需要列 1 和列 2 时)。

数据分块

如果想从服务器获取大量的数据,应使用数据分块。 分块改进了网络带宽的使用,并同时减少了主机或 AS/400 数据库服务器和 DB2 Connect 工作站的 CPU 额外开销。

对于发送和接收的每条信息(不考虑其大小),CPU 和网络额外开销是固定的量。 数据分块减少了相同量的数据传送所需的信息数。

借助于分块,查询中的首行数据将在接收到首个块之后才发送至应用程序。 分块增加了首行的检索时间,但改进了后续行的检索时间。

另一个考虑事项是所使用的内存量。通常,在进行分块时, 内存工作集会增加。对于使用 SNA 连接时分块的完整讨论,参考 DRDA Connectivity Guide

在 DB2 Connect 内,您可控制每个块内被传送的数据量, 如RQRIOBLK中所述。

要调用分块,使用 prep 或 bind 命令的 BLOCKING 选项。 (有关详情,参见BIND 命令。)如果下列情况为真,则分块处于打开状态:

对于只读、可更新和模糊游标的定义,参考 Application Development Guide
注意:使用动态 SQL 时,游标总是处于模糊状态。

带有 BLOCKING 的 SQL 语句

可更新的 SELECT 语句(使用 UPDATE/DELETE WHERE CURRENT OF 语句)是非分块查询,所以仅在绝对必要时才应使用它们。

可更新的 SELECT 保证了在完成 SELECT 与发出 UPDATE/DELETE 之间的时间期内不会更改该行。 如果此并行级别对于应用程序并不重要, 则另一个选择是使用带有搜索条件(它们基于从不可更新的 SELECT 返回的某些值) 的 DELETEUPDATE

对于只读 SELECT,指定 FOR FETCH ONLY (在 VM 和 VSE 中除外,在其中它是不受支持的)。

静态和动态 SQL

尽量使用静态 SQL。它避免了运行期 SQL 部分的准备和模糊游标的出现。 如果不能避免使用动态 SQL,则可执行下列操作以最大限度地减少网络通信量和改进性能:

其他 SQL 考虑事项

总的来说,在程序中使用命令行处理器比使用动态 SQL 速度慢, 原因是命令行处理器必须在将 SQL 提交给数据库引擎以前分析输入。 命令行处理器还在接收到数据时对它进行格式化,这对于应用程序来说可能是不必要的。

实际上,解释语言(如 REXX)中的 SQL 语句比编译语言(如 C) 中的同一 SQL 语句的执行速度慢。

有两种类型的 CONNECT 语句,称为类型 1 和类型 2。有了类型 2 连接, 连接至数据库将会使前一个连接进入休止状态,但不卸下它。 如果稍后切换至休止连接,则避免了装入库和设置内部数据结构的额外开销。 由于此原因,使用类型 2 连接可改进存取多个数据库的应用程序的性能。 有关类型 2 连接的详情,参考管理指南SQL Reference


[ 页的顶部 | 上一页 | 下一页 | 目录 | 索引 ]