zoukankan      html  css  js  c++  java
  • 11 半联结 & 反联结

    半联结 和 反联结是 oracle 优化器能够选择用来在获取信息时应用的两个密切相关的联结方法(实际上是联结方法的选项)

    半联结

    IN 的半联结

    select /* using in */ department_name

      from hr.departments dept

    where department_id IN (select department_id from hr.employees emp);

    EXISTS 半联结

    select /* using exists */ department_name

      from hr.departments dept

    where EXISTS(select null from hr.employees emp where emp.department_id = dept.department_id);

    EXISTS 和 IN 的可替换语法

    select /* inner join */ department_name

      from hr.departments dept, hr.employees emp

    where dept.department_id = emp.department_id;

    控制半联结执行计划

    半联结 实际上就是双层for循环, 注意下边的: NESTED LOOPS SEMI (半联结的标志)

    image

    使用提示控制半联结执行计划

    SEMIJOIN - 进行半联结

    NO_SEMIJOIN - 不进行半联结

    例如:

    select /* exists no_semijoin */ department_name

      from hr.departments dept

    where exists (select /*+ no_semijoin */) null from hr.employees emp where emp.department_id = dept.department_id);

    因为我们提供了 no_semijion 的提示, 所以, 执行计划中就没有在使用半联结, 而是使用了 filter(exists (select o from ))

    image

    反联结

    image

    总结: 实际上, 以上的联结, 我都有在前面的 table join 类型时 有单独拿出来讲过, 所以, 这里不在详细说明.

    总结的结果就是, 由于我们使用的优化器一般都是基于成本的, 所以, 只使用 EXISTS 和 外连接 两种.

  • 相关阅读:
    优达,计算机科学导论
    关于未来发展阶段小结
    CS50.5
    CS50.4
    简单查看tomcat中部署java服务的内存使用情况
    python3环境搭建(CentOS7.2)
    mysql主从配置脚本
    安装rkhunter
    转移到博客园啦!
    Eclipse上Maven环境配置使用 (全)
  • 原文地址:https://www.cnblogs.com/moveofgod/p/4223092.html
Copyright © 2011-2022 走看看