如果查询包含一个 IN 子句,该子句在同一个列上有用 OR 链接的多个值或等式谓词,则会使用 INLIST 迭代程序。
INLIST ITERATOR 运算符将对枚举值列表进行迭代运算,对每个值都单独执行一次。
原有语句的执行计划与用等式子句代替 IN 子句的语句的执行计划相同,但增加了一个步骤。INLIST ITERATOR 该额外步骤发生在为等式子句提供列表中的唯一值时。
在 PL/SQL 中,此运算符作为 FOR LOOP 语句出现。在幻灯片上的示例中,对两个值进行了索引探测迭代运算:1 和 2。
此外,它还是一个使用索引的函数;将对索引进行扫描以查找列表中的每个值。一种替代方式是用 UNION ALL 合并每个值,或者将 FILTER 用于所有行以过滤出所需的值,这些方式的效率会高得多。
如果指定了带值的 IN 子句,并且优化程序为该列找到了一个选择性索引,则优化程序将使用 INLIST ITERATOR。如果存在使用同一个索引的多个 OR 子句,则优化程序将选择此运算,而不是 CONCATENATION 或 UNION ALL,因为此运算的效率更高。