创建应用程序时,可以几种方法来改进性能,包括:
对于发送和接收很多命令和答复的应用程序, 网络开销可能十分大。复合 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 时,游标总是处于模糊状态。 |
可更新的 SELECT 语句(使用 UPDATE/DELETE WHERE CURRENT OF 语句)是非分块查询,所以仅在绝对必要时才应使用它们。
可更新的 SELECT 保证了在完成 SELECT 与发出 UPDATE/DELETE 之间的时间期内不会更改该行。 如果此并行级别对于应用程序并不重要, 则另一个选择是使用带有搜索条件(它们基于从不可更新的 SELECT 返回的某些值) 的 DELETE 或 UPDATE。
对于只读 SELECT,指定 FOR FETCH ONLY (在 VM 和 VSE 中除外,在其中它是不受支持的)。
尽量使用静态 SQL。它避免了运行期 SQL 部分的准备和模糊游标的出现。 如果不能避免使用动态 SQL,则可执行下列操作以最大限度地减少网络通信量和改进性能:
如果分配给 SQLDA 的数目不足够大, 不能存储返回的 SQLDA,则程序必须发出另一个有足够大 SQLDA 的 DESCRIBE,以再次存储结果。这将增加网络通信量。
总的来说,在程序中使用命令行处理器比使用动态 SQL 速度慢, 原因是命令行处理器必须在将 SQL 提交给数据库引擎以前分析输入。 命令行处理器还在接收到数据时对它进行格式化,这对于应用程序来说可能是不必要的。
实际上,解释语言(如 REXX)中的 SQL 语句比编译语言(如 C) 中的同一 SQL 语句的执行速度慢。
有两种类型的 CONNECT 语句,称为类型 1 和类型 2。有了类型 2 连接, 连接至数据库将会使前一个连接进入休止状态,但不卸下它。 如果稍后切换至休止连接,则避免了装入库和设置内部数据结构的额外开销。 由于此原因,使用类型 2 连接可改进存取多个数据库的应用程序的性能。 有关类型 2 连接的详情,参考管理指南和 SQL Reference。