公共子表达式消除是一项启发式的查询转换技术,它将反意连接词(如 OR)连接的谓词进行合并,消除不必要的子表达式。
提示:公共子表达式消除可以由优化器参数"_eliminate_common_subexpr"控制。
上述例子中,转换器通过将 OR 连接的两个谓词表达式合并,从而减少了以连接操作。
公共子表达式消除无法从概要数据或执行计划中鉴别出来,但是可以从 11g 的 10053 事件跟踪可以发现公共子表达式消除的转换。
计数函数转变(Count Convertion)
计数函数转变是一项启发式的查询转换技术,它将表达式 COUNT(Column)转变为 COUNT(*)。
上面例子中,count(table_name)被转变为 COUNT(*)。
计数函数转变无法从概要数据或执行计划中鉴别出来,但是可以从 11g 的 10053 事件跟踪可以发现公共子表达式消除的转换。
注意,由于空值不会被计数,因此计数函数转变不会转换对允许空值的字段进行转换。
表达式和条件评估(Evaluation of Expressions and Conditions)
表达式和条件评估是一项启发式的查询转换技术,它将一些表达式转换为更加高效、语义上等价的表达式。
常量转换
将表达式计算出结果,用该结果作为常量替换原表达式。
上述例子中,表达式 10*10 被常量 100 所替换。
LIKE 转换
LIKE 本身是一个范围匹配操作,但是如果 LIKE 匹配的表达式中没有通配符(如%、_),则与“=”等价。
提示:上述执行计划输出是在 11g 当中。而在 10g 及之前版本,在谓词信息中看不出这一转换, 但执行计划相应的访问路径却是按照转换后得出的。
IN 转换
将 IN 操作符转换为 OR 连接表达式。
在上例中,谓词条件 USERNAME IN (:A, :B)被转换成(“USERNAME”=:A OR “USERNAME”=:B)
ANY/SOME 转换将 ANY/SOME 转换为 OR 连接表达式或者 EXISTS 子查询。示例 1:
在上例中,谓词条件 avg_row_len > any (:A,:B)被转换为谓词表达式(“AVG_ROW_LEN”>TO_NUMBER(:A) “AVG_ROW_LEN”>TO_NUMBER(:B))。a
示例 2:
上面示例将 SOME 转换为了 EXISTS 子查询,即与以下查询等价:
ALL 转换
将 ALL 转换为 AND 连接表达式、GREATEST 函数或者 NOT EXISTS 子查询。示例 1:
以上示例中,谓词条件 avg_row_len > ALL (:A,:B)被转换成了"AVG_ROW_LEN">TO_NUMBER(:A)
AND “AVG_ROW_LEN”>TO_NUMBER(:B)。
示例 2:
上述例子在 10.2.0.4 中运行,ALL 被转换成了 NOT EXISTS 子句。而在 11.2.0.1 当中,还能将
NOT EXISTS 子句进一步展开,转换成对空值敏感的反关联操作。
BETWEEN AND 转换优化器在任何情况下都会将 BETWEEN AND 转换为<=、>=
NOT 转换
优化器会对含有 NOT 操作的表达式进行逻辑转换。
上述例子中,转换器先将 not avg_row_len > ALL (:A,:B)转换为 avg_row_len <= ANY (:A,:B),然后将 ANY 转换为 OR 表达式。
逻辑传递优化器可以根据谓词之间的逻辑传递关系,将某个谓词条件中的表达式或常量传递给另外一个谓词条件。
上述例子中,根据 LOCK_DATE 与 EXPIRY_DATE 之间的关系(“LOCK_DATE”<“EXPIRY_DATE”), 将"EXPIRY_DATE"<:A 传递给了 LOCK_DATE。