映射包含记录数组定义的表时,查询产生的结果集返回的行可能非常多,以致使性能受到影响。
当表包含多个映射为数组的记录数组定义时,引用该表的查询将产生较大的结果集。要避免出现性能问题,请执行下列其中一项操作:
如果对每个数组映射一个单独的表,那么联合查询可以读取数据。如果使结构变成平面结构,那么客户机应用程序可以插入、更新和删除行。
将记录数组定义映射为数组时,Classic Data Architect 会将数据定义转换为 SQL 列。将每个数组实例与非数组数据项组合在一起创建 SQL 行。例如,如果数据库中对应职员标识 123456789 的记录包含三个家属,那么会对该记录返回三个不同的行。以下查询在结果集中返回三行:
查询:
SELECT EMP_ID, NUMBER_OF_DEPENDENTS, DEP_ID, DEP_NAME FROM CAC.EMPL WHERE EMP_ID = '123456789';
EMP_ID NUMBER_OF_DEPENDENTS DEP_ID DEP_NAME 123456789 3 111223333 Depen1 123456789 3 222334444 Depen2 123456789 3 333445555 Depen3
计算结果集的大小
在 WHERE 子句中提供任何过滤谓词之前,可以使用公式来计算对包含数组的表执行查询所产生的结果集中的行数。结果集中的行数是下列项的笛卡尔乘积:
<每个记录数组中的实例数> * <物理记录数>
对于可变长度数组,除非您知道每个数组存在多少个实例,否则不能计算结果集中的行数。
以下示例说明多个数组如何导致由于较大的结果集而产生的性能问题。
查询对每个职员生成 4 * 2 * 3 = 24 行,因此结果集中将生成 24 * 200 = 4800 行。
01 EMPLOYEE-RECORD. ... 05 DEPENDENTS-ARRAY OCCURS 20 TIMES. ... 05 ORGS-ARRAY OCCURS 5 TIMES PIC X(10).
如果使用 Classic Data Architect 中的“新建表”向导来为此记录布局创建表定义,并且将两个数组映射至同一个表,那么单个职员记录的结果集是 DEPENDENTS-ARRAY 和 ORGS-ARRAY 的笛卡尔乘积。
查询处理器不返回 NULL 数组实例。在此示例中,职员有四个家属和两个专业组织。查询将对该职员生成 4 * 2 = 8 行。