如下为 rewriter 处理的多种 query transformation 方法:
1)Filter Push Down
将 filter 落到最大程度上可落的位置,由此减少需要处理的中间结果
2)DISTINCT Elimination
删除不需要的 DISTINCT。如下情况可删除 DISTINCT。
●Single-row aggregation 的查询结果为一个,因此没有 DISTINCT 也不会出现重复的结果。
●有 Group by 并 group by 的所有 key column 存在于 select list 时,其结果为 unique,因此没有 DISTINCT 也不会出现重复的结果。
●Primary key 的所有 key column 存在于 select list 时,其结果为 unique,因此没有DISTINCT 也不会出现重复的结果。
3)ORDER BY Elimination
删除不需要的 ORDER BY。如下情况不需要 ORDER BY。
●From 子句中只有一个 view,并有 group by 子句或 distinct 子句或 order by 子句时,不需要 view 内部 queryblock
中的 order by。即使排列也会由于外部的 group by、distinct、order by 等,排列顺序会消失。
●不需要子查询内部 query block 中的 order by。子查询的结果仅用于决定是否返回 outer query 的 row。
4)Simple View Merging
将不包含 Group by、distinct、aggregation 等的 simple view merge 到上级 query block。适用 simple view merging 时,
optimizer 可选择多种 access path、join ordering、join method,因此可获取更好的执行计划。
如下情况无法适用 simple view merging:
●View 内部的 query block 包含如下项目时
○Set operator
○LIMIT, OFFSET
○DISTINCT
○GROUP BY
○Single row aggregation
○Full outer join
○Natural join
○ROWNUM
○SELECT list 中有 subquery expression 时
●View 参与了如下查询时
○view 参与了 Full outer join
○view 参与了 Left outer join 并在 view 内部有两个以上的表
5)Outer Join Table Elimination
删除不需要的 outer join table。如下情况时,不需要 outer join,也不需要访问 right table。
●是 Left outer join,
○ON 子句中有'left_table.col = right_table.col' 形式的 predicate
○有 ON 子句的 right_table.col 的 unique index
○除 ON 子句条件外的其他所有子句中,不使用 right table 的 column
6)Outer Join Operation Elimination
删除不需要的 outer join operation。
●Left outer join 的情况,
○Where 子句中有属于右侧表的条件子句,并其条件子句不是 IS NULL 时,
■可变更为 Inner join。
●Full outer join 的情况,
○Where 子句中有属于右侧表的条件子句,并其条件子句不是 IS NULL 时,
■可变更为 Right outer join。
○Where 子句中有属于左侧表的条件子句,并其条件子句不是 IS NULL 时,
■可变更为 Left outer join。
○Where 子句中有均属于两侧表的条件子句,并其条件子句不是 IS NULL 时,
■可变更为 Inner join。
7)优化 EXISTS/NOT EXIST 运算 Target
在 EXISTS 或 NOT EXISTS 中的 subquery 的 SELECT list 中,减少不需要的 expression 处理,从而提高查询处理性能。
EXISTS 或 NOT EXISTS 运算时判断是否存在子查询的结果 row 的运算符,因此子查询的SELECT list 中的 expression
的数量或处理结果不影响运算结果。所以将子查询的 SELECT list 变更为 BOOLEAN 常数 TRUE。
8)Quantifier Elimination
如下变更 SQL 后删除 ANY quantifier。
9)Transitive Closure
使用 join 条件,在其他表生成常数条件。这样可减少 join 处理量,并提高性能。
10)Join Transitive Closure
使用 join 条件,在其他表生成 join 条件。可以选择多种 join ordering 和 join method,获取更佳的执行计划。
在 A = B AND B = C join 条件添加 A = C join 添加的方式
11)Subquery Unnesting
Subquery unnesting 是将条件子句中的子查询转换为保证相同结果的 join 语句的功能。这
次处理后可选择多种 access path、join method、join order,因此可获取更佳的执行计划。
Subquery 可分为如下两种。
●Nested subquery (Regular non-scalar subquery )
○EXISTS/NOT EXIST subquery
○比较运算符 ( =, >,>=, <, <=, <>) ANY subquery
○比较运算符 ( =, >,>=, <, <=, <>) ALL subquery
○IN/NOT IN subquery
●Scalar subquery : 写在 WHERE 子句或 SELECT list,仅返回一个值
不是所有子查询会 unnest。要满足如下约束条件才可以进行 subquery unnesting。
●不应包含 Set 运算符。
●Scalar subquery 仅可在写在 WHERE 子句时使用。
●应包含 Correlated predicate。
12)Complex View Merging
将包含 group by 的 view 与上级 query block 进行 merge。
通过 group by 无法大幅减少中间结果,并与上级 query block 的 join filtering 效果大时使用会更有效。
因此,在通过 group by 可大幅减少中间结果时适用反而会降低性能
如下情况无法适用 complex view merging:
●View 内部 query block 包含如下项目
○SET operator
○ROWNUM
○LIMIT/OFFSET
○Single row aggregation
○ORDER BY
○包含 Subquery 的 SELECT list
○FULL OUTER JOIN
○NATURAL JOIN
●View 参与如下查询时
○Inner join 以外的 join
○没有 equi join predicate 时
登录后发表回复
技术专家
文章
9阅读量
53获赞
7码筑匠心 2024-07-30
码筑匠心 2024-07-30
码筑匠心 2024-07-29
码筑匠心 2024-07-29
码筑匠心 2024-07-29