控制数据库管理器分块
为了提高性能, SQL 运行时会尝试在一次可能的情况下从数据库管理器中检索并插入一个块的行。
如果需要,可以控制分块。 在调用包含 SQL 语句的应用程序之前,请在 CL 命令 Override Database File (OVRDBF) 上使用 SEQONLY 参数。 还可以在 CRTSQLxxx 命令 上指定 ALWBLK 参数或使用 QSY2.OVERRIDE_TABLE 应用程序服务。
在以下情况下,数据库管理器不允许分块:
- 游标可更新或删除。
- 行的长度加上反馈信息大于 32767。 反馈信息的最小大小为 11 个字节。 反馈大小由游标所使用的索引键列中的字节数以及可空的键列 (如果有) 数增加。
- 指定了 COMMIT (*CS) ,但未指定 ALWBLK (*ALLREAD)。
- 指定了 COMMIT (*ALL) ,并且满足以下条件:
- 未使用 SELECT INTO 语句或分块 FETCH 语句
- 查询不使用列函数或按列指定组。
- 不需要创建临时结果表。
- 指定了 COMMIT (*CHG) ,但未指定 ALWBLK (*ALLREAD)。
- 游标包含至少一个子查询,且最外层的子选择提供了一个子查询的相关引用,或者最外层的子选择处理了一个带有 IN、= ANY 或 < > ALL 子查询谓词操作符的子查询,该子查询被视为相关引用,且该子查询不可隔离。
在下列情况下, SQL 运行时将使用数据库管理器自动阻止行:
- 插入如果 INSERT 语句包含 SELECT 语句,那么插入的行将被阻塞并且不会插入到目标表中,直到该块已满为止。 SQL 运行时会自动对阻塞的插入执行分块。注: 如果指定了带有 VALUES 的 INSERT ,那么在程序结束之前, SQL 运行时可能不会关闭用于执行插入的内部游标。 如果再次运行相同的 INSERT 语句,那么不需要完全打开,并且应用程序将以更快的速度运行。
- 打开如果满足以下所有条件,那么在检索行时,将在 OPEN 语句下执行分块:
- 游标仅用于 FETCH 语句。
- 程序中没有 EXECUTE 或 EXECUTE IMMEDIATE 语句,或者指定了 ALWBLK (*ALLREAD) ,或者使用 FOR FETCH ONLY 子句声明了游标。
- 指定了 COMMIT (*CHG) 和 ALWBLK (*ALLREAD) ,指定了 COMMIT (*CS) 和 ALWBLK (*ALLREAD) ,或指定了 COMMIT (*NONE)。