ITPub博客

首页 > 数据库 > Oracle > CBO的查询转换(谓词推入与子查询展开(Subquery Unnesting))

CBO的查询转换(谓词推入与子查询展开(Subquery Unnesting))

原创 Oracle 作者:abstractcyj 时间:2016-04-13 14:04:40 0 删除 编辑
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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
曾从事java方向开发多年。近年已经转入数据库方向。主要擅长SQL优化,Oracle数据库问题诊断,Oracle备份与恢复等。服务于医药物流,医院等行业

注册时间:2010-01-26

  • 博文量
    602
  • 访问量
    1091589