提高访问分布式数据的应用性能

提高访问远程数据的应用程序性能的关键在于限制网络传输的次数。

关于本任务

发送到远程系统的查询有时比在本地 Db2 子系统上访问相同大小的表执行相同的查询花费的时间更长。 执行时间可能增加的主要原因是:

  • 通过网络发送信息所需的时间
  • 开销处理,包括启动和通信子系统会话管理

例如,网络处理等部分开销处理不在 Db2 的控制范围内。

在分布式环境中监控和调整性能是一项复杂的任务,需要了解多种产品。

过程

为了最大限度地提高访问分布式数据的性能,请使用以下方法:

  • 请根据以下建议编写访问分布式数据的任何查询,以限制这些查询通过网络发送的消息数量:
    • 通过尽可能缩短选择列表来减少结果表中的列和行数,并使用WHERE、GROUP BY和HAVING子句来消除远程服务器上不需要的数据。
    • 对于返回数千行的查询,请尽可能指定“仅获取”或“仅读取”子句。 然后,您可以使用DBPROTOCOL(DRDACBF)选项绑定包含这些查询的应用程序,以便 Db2 能够使用基于包的连续块获取来检索行。 通过这种连续块获取,请求者会为每个游标打开一个与服务器的辅助连接。 服务器可以同时发送所有游标的资料。

      使用这种连续块获取方式比使用基于SQL的连续块获取方式性能更好。

  • 对于可能包含大量结果表但仅需要有限行数的查询,请指定 FETCH FIRST n ROWS ONLY子句
    此条款限制了返回给客户端程序的行数。
    例如,假设您只需要结果表中的一行。 您可以添加FETCH FIRST 1 ROW ONLY子句,如下例所示:
    SELECT * FROM EMP  OPTIMIZE FOR 1 ROW ONLY  FETCH FIRST 1 ROW ONLY;
    在这种情况下,FETCH FIRST 1 ROW ONLY(仅取第一行)条款可避免15次不必要的预取。
  • 如果您的程序访问远程表中的LOB列,请使用以下技术来减少客户端和服务器之间传输的字节数:
    • 使用LOB定位器代替LOB主变量。

      如果您只需要在客户端存储部分 LOB 值,或者您的客户端程序需要处理 LOB 数据,但不需要副本,那么 LOB 定位器是一个不错的选择。 当客户程序从服务器检索 LOB 列到定位器时, Db2 仅将 4 字节的定位器值传输到客户端,而不是整个 LOB 值。

    • 使用存储过程结果集。

      当您从存储过程向客户端程序返回LOB数据时,请使用结果集,而不是将LOB数据作为参数传递给客户端。 使用结果集返回数据可以减少LOB的实体化和地址空间之间的数据移动。

    • 请将当前规则特殊注册设置为 Db2

      Db2 服务器收到游标的OPEN请求时,服务器使用CURRENT RULES特殊寄存器中的值来确定相关语句用于检索LOB值的主变量类型。 如果在执行连接操作之前,为当前规则特殊寄存器指定了 Db2 的值,并且游标的第一个FETCH语句使用LOB定位器来检索LOB列的值,则 Db2 允许您在该列的所有后续FETCH语句中仅使用LOB定位器,直到关闭游标。 如果第一个FETCH语句使用了一个主机变量, Db2 允许您在该列的所有后续FETCH语句中仅使用主机变量,直到您关闭光标。 但是,如果将当前规则(CURRENT RULES)的值设置为标准(STD),则 Db2 允许您使用相同的打开光标将LOB列提取到LOB定位器或主机变量中。

      虽然当前规则特殊寄存器的STD值在检索LOB数据时能提供更大的编程灵活性,但使用 Db2 值可以获得更好的性能。 使用STD选项时,服务器必须为每个FETCH语句发送和接收网络消息,以指示正在传输的数据是LOB定位符还是LOB值。 使用 Db2 选项后,服务器在第一次FETCH后就知道LOB数据的大小,因此无需发送关于LOB数据大小的额外消息。 服务器可以同时向请求者发送多个数据块,从而缩短数据传输的总时间。

    例如,假设用户想要浏览大量员工记录,但只查看其中部分员工的照片。 在服务器上,将当前规则特殊寄存器设置为 Db2。 在应用程序中,您声明并打开光标以选择员工记录。 应用程序随后将所有图片数据提取到4字节LOB定位器中。 因为 Db2 知道每个FETCH语句返回4字节的LOB数据,所以 Db2 可以用许多图片的定位符填充网络缓冲区。 当用户想要查看特定人物的图片时,应用程序可以通过将LOB定位器引用的值分配给LOB主变量,从服务器中检索图片。 以下代码实现了这种情况:
    SQL TYPE IS BLOB my_blob[1M];
    SQL TYPE IS BLOB AS LOCATOR my_loc;
    ⋮
    FETCH C1 INTO :my_loc;    /* Fetch BLOB into LOB locator  */
    ⋮
    SET :my_blob = :my_loc; /* Assign BLOB to host variable */
  • 请尽可能确保每个光标满足以下条件之一,以便 Db2 使用块获取来减少通过网络发送的消息数量:
    • 光标使用“仅用于获取”或“仅用于读取”子句进行声明。
    • 光标是不可滚动的,光标的结果表是只读的。
    • 光标是一个可滚动的光标,被声明为不敏感,且光标的结果表是只读的。
    • 光标是一个可滚动的光标,被声明为敏感光标,光标的结果表是只读的,并且当前数据绑定选项的值为否。
    • 光标的显示结果表不是只读的,但光标是模糊的,并且 CURRENTDATA 绑定选项的值为 NO。
      当以下任一条件成立时,光标即表示不明确:
      • 它没有定义为仅获取、仅读取或仅更新。
      • 它不是由只读结果表定义的。
      • 它不是SQL UPDATE或DELETE语句中WHERE CURRENT子句的目标。
      • 它包含在包含 SQL 语句 PREPARE 或 EXECUTE IMMEDIATE 的计划或包中。
  • 对于 ODBC 和 JDBC 应用程序,使用行集参数来限制从获取操作返回的行数。
    如果DRDA请求者将行集参数发送到 Db2 服务器,服务器将执行以下操作:
    • 返回的行数不超过行集参数中的行数
    • 如果服务器上分布式数据设施面板2的安装面板上的额外块SRV字段的值允许返回额外的查询块,则返回额外的查询块
    • 如果指定了 FETCH FIRST n ROWS ONLY子句 ,则处理该子句
    • 不处理 “优化n行”子句
  • 对于某些绑定选项,请使用建议的值。
    如需了解推荐的绑定选项的更多信息,请参阅分布式应用的绑定选项