1. 谓词推入
谓词推入是将外层的相关谓词,推入至内层查询视图当中(View Query Block),使得内层视图可以利用谓词进行索引扫描或者过滤
如:
SELECT col1, col2, col3 FROM (select col1, col2, col3 from table_a a union all
select col1, col2, col3 from table_b b )
WHERE col1 = 'SAMPLE'
=>
SELECT col1, col2, col3 FROM (select col1, col2, col3 from table_a a where col1 = 'SAMPLE' union all
select col1, col2, col3 from table_b b WHERE col1 = 'SAMPLE')
如果没有谓词推入, table_a, table_b肯定都是进行全表扫描,有了谓词推入, table_a.col1, table_b.col1, 有了创建索引进行索引扫描的可能。
2. 子查询展开(Subquery Unnesting):
子查询展开的意思是, 优化器将一个嵌套查询展开为等价的表连接, 进而优化表连接。
子查询展开使得优化器可以考虑子查询相关表的访问路径,关联顺序,关联方式的选择。只有当转换之后的语句与转换之前的语句返回相同的行数,并且子查询不包含AVG这样的聚合函数的时候,才会进行这样的转换。
例:
SELECT *
FROM sales
WHERE cust_id IN ( SELECT cust_id
FROM customers );
=>
SELECT sales.*
FROM sales, customers
WHERE sales.cust_id = customers.cust_id;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8520577/viewspace-2080434/
,如需转载,请注明出处,否则将追究法律责任。