避免数字转换

比较列值和主变量 (或常量值) 时,请尝试指定相同的数据类型和属性。 Db2 for i 如果主机变量或常量值的精度高于列的精度,则可能不会为指定列使用索引。 如果要比较的两个项具有不同的数据类型,那么 Db2 for i 需要转换其中一个或另一个值,这可能会导致不准确 (因为机器精度有限)。

要避免比较列和常量时出现问题,请使用以下命令:

  • 相同数据类型
  • 相同比例 (如果适用)
  • 相同精度 (如果适用)

例如, EDUCLVL 是半字整数值 (SMALLINT)。 使用 SQL 时,请指定:

WHERE EDUCLVL < 11 AND
                   EDUCLVL >= 2

而不是

WHERE EDUCLVL < 1.1E1 AND
                   EDUCLVL > 1.3

使用 OPNQRYF 命令时,请指定:

... QRYSLT('EDUCLVL *LT 11 *AND ENUCLVL *GE 2')

而不是

... QRYSLT('EDUCLVL *LT 1.1E1 *AND EDUCLVL *GT 1.3')

如果通过 EDUCLVL 列创建了索引,那么在第二个示例中,优化器可能不会使用该索引。 常量精度大于列精度。 它尝试将常量转换为列的精度。 在第一个示例中,优化器考虑使用索引,因为精度相等。