未使用索引的实例

Db2 for i 在某些实例中不使用索引。

  • 对于期望更新的列; 例如,在使用 SQL 时,程序可能包含以下内容:
    EXEC SQL
     DECLARE DEPTEMP CURSOR FOR
        SELECT EMPNO, LASTNAME, WORKDEPT
          FROM CORPDATA.EMPLOYEE
          WHERE (WORKDEPT = 'D11' OR
                   WORKDEPT = 'D21') AND
                  EMPNO = '000190'
          FOR UPDATE OF EMPNO, WORKDEPT
    END-EXEC.

    使用 OPNQRYF 命令时,例如:

    OPNQRYF FILE((CORPDATA/EMPLOYEE)) OPTION(*ALL)
       QRYSLT('(WORKDEPT *EQ ''D11'' *OR WORKDEPT *EQ ''D21'')
       *AND EMPNO *EQ ''000190''')

    即使您不打算更新员工部门,系统也不能使用键为 WORKDEPT 的索引。

    如果所有索引可更新列也在查询中用作具有相等运算符的可等式选择谓词,那么可以使用索引。 在上一个示例中,系统使用键为 EMPNO 的索引。

    如果 FOR UPDATE OF 列列表仅将您打算更新的列命名为 WORKDEPT,那么系统可以更高效地运行。 因此,请勿在 FOR UPDATE OF 列列表中指定列,除非您打算更新该列。

    如果由于动态 SQL 而具有可更新游标,或者未指定 FOR UPDATE 并且程序包含 UPDATE 语句,那么可以更新所有列。

  • 对于要与同一行中的另一列进行比较的列。 例如,使用 SQL 时,程序可能包含以下内容:
    EXEC SQL
     DECLARE DEPTDATA CURSOR FOR
        SELECT WORKDEPT, DEPTNAME
          FROM CORPDATA.EMPLOYEE
          WHERE WORKDEPT = ADMRDEPT
    END-EXEC.

    使用 OPNQRYF 命令时,例如:

    OPNQRYF FILE (EMPLOYEE) FORMAT(FORMAT1)
       QRYSLT('WORKDEPT *EQ ADMRDEPT')

    即使存在 WORKDEPT 的索引以及 ADMRDEPT的另一个索引, Db2 for i 也不会使用任何一个索引。 由于需要查看表中的每行,因此该索引没有额外的优点。