上一篇解析链接如下:

https://www.cnblogs.com/wcwen1990/p/9325968.html

1、SQL示例1:

SQL> select *

from (

select * from tmp1 where c >= 1

) t1 left join (

select * from tmp2 where b < 30

) t2 on t1.a = t2.a

and t2.d > 1 and t1.e >= 2

where t1.b < 50

;

A        B           C      E         A        B       D          E

---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
      2       20           2      2         2           20       2          2
      4       40           4      4
      3       30           3      3
      1       10           1      1

Execution Plan

----------------------------------------------------------

Plan hash value: 2592321047

---------------------------------------------------------------------------

| Id  | Operation       | Name | Rows  | Bytes | Cost (%CPU)| Time      |

---------------------------------------------------------------------------

|   0 | SELECT STATEMENT   |      |    4 |   416 |    7  (15)| 00:00:01 |

|*  1 |  HASH JOIN OUTER   |      |    4 |   416 |    7  (15)| 00:00:01 |

|*  2 |   TABLE ACCESS FULL| TMP1 |    4 |   208 |    3   (0)| 00:00:01 |

|*  3 |   TABLE ACCESS FULL| TMP2 |    1 |    52 |    3   (0)| 00:00:01 |

---------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - access("TMP1"."A"="TMP2"."A"(+))
        filter("TMP1"."E">=CASE    WHEN ("TMP2"."A"(+) IS NOT NULL) THEN 2
           ELSE 2 END )
    2 - filter("TMP1"."B"<50 AND "C">=1)
    3 - filter("TMP2"."D"(+)>1 AND "B"(+)<30)

Note

-----
    - dynamic sampling used for this statement (level=2)

Statistics

----------------------------------------------------------
       0  recursive calls
       0  db block gets
       7  consistent gets
       0  physical reads
       0  redo size
        1082  bytes sent via SQL*Net to client
     524  bytes received via SQL*Net from client
       2  SQL*Net roundtrips to/from client
       0  sorts (memory)
       0  sorts (disk)
       4  rows processed

postgres=# explain analyze select *

postgres-# from (

postgres(# select * from tmp1 where c >= 1

postgres(# ) t1 left join (

postgres(# select * from tmp2 where b < 30

postgres(# ) t2 on t1.a = t2.a

postgres-# and t2.d > 1 and t1.e >= 2

postgres-# where t1.b < 50

postgres-# ;
                                                   QUERY PLAN                                                 

--------------------------------------------------------------------------------------------------------------
  Hash Left Join  (cost=34.90..80.00 rows=181 width=32) (actual time=0.021..0.035 rows=4 loops=1)
    Hash Cond: ("outer".a = "inner".a)
    Join Filter: ("outer".e >= 2)
    ->  Seq Scan on tmp1  (cost=0.00..34.45 rows=181 width=16) (actual time=0.006..0.011 rows=4 loops=1)
          Filter: ((c >= 1) AND (b < 50))
    ->  Hash  (cost=34.45..34.45 rows=181 width=16) (actual time=0.007..0.007 rows=1 loops=1)
          ->  Seq Scan on tmp2  (cost=0.00..34.45 rows=181 width=16) (actual time=0.002..0.003 rows=1 loops=1)
                Filter: ((b < 30) AND (d > 1))
  Total runtime: 0.063 ms

(9 rows)

SQL执行计划的分析:

1) 全表扫描左表TMP1,同时根据TMP1表子查询条件"C">=1和where过滤条件"T1"."B"<50联合过滤,即filter("TMP1"."B"<50 AND "C">=1),计算结果临时表记为tmp1;

2) 全表扫描右表TMP2,同时根据TMP2表子查询条件"B"(+)<30和on子句"T2"."D"(+)>1联合过滤,即filter("TMP2"."D"(+)>1 AND "B"(+)<30),计算结果临时表记为tmp2;

3) 左表TMP1及右表TMP2处理后临时表tmp1和tmp2通过access("TMP1"."A"="TMP2"."A"(+))连接条件进行Hash Left Join操作,左临时表结果集全量返回,右表不匹配行置为null,返回结果临时表记为tmp3;

4) 返回结果集。

2、SQL示例2:

SQL> select *

from (

select * from tmp1 where c >= 1

) t1 left join (

select * from tmp2 where b < 30

) t2 on t1.a = t2.a

and t2.d > 1 and t1.e >= 2

where t1.b < 50 and t2.e <= 3

;

A        B           C      E         A        B       D          E

---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
      2       20           2      2         2           20       2          2

Execution Plan

----------------------------------------------------------

Plan hash value: 1630095649

---------------------------------------------------------------------------

| Id  | Operation       | Name | Rows  | Bytes | Cost (%CPU)| Time      |

---------------------------------------------------------------------------

|   0 | SELECT STATEMENT   |      |    1 |   104 |    7  (15)| 00:00:01 |

|*  1 |  HASH JOIN       |      |    1 |   104 |    7  (15)| 00:00:01 |

|*  2 |   TABLE ACCESS FULL| TMP2 |    1 |    52 |    3   (0)| 00:00:01 |

|*  3 |   TABLE ACCESS FULL| TMP1 |    3 |   156 |    3   (0)| 00:00:01 |

---------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - access("TMP1"."A"="TMP2"."A")
    2 - filter("TMP2"."E"<=3 AND "TMP2"."D">1 AND "B"<30)
    3 - filter("TMP1"."B"<50 AND "TMP1"."E">=2 AND "C">=1)

Note

-----
    - dynamic sampling used for this statement (level=2)

Statistics

----------------------------------------------------------
       9  recursive calls
       0  db block gets
      15  consistent gets
       0  physical reads
       0  redo size
     981  bytes sent via SQL*Net to client
     524  bytes received via SQL*Net from client
       2  SQL*Net roundtrips to/from client
       0  sorts (memory)
       0  sorts (disk)
       1  rows processed

SQL>

postgres=# select *

postgres-# from (

postgres(# select * from tmp1 where c >= 1

postgres(# ) t1 left join (

postgres(# select * from tmp2 where b < 30

postgres(# ) t2 on t1.a = t2.a

postgres-# and t2.d > 1 and t1.e >= 2

postgres-# where t1.b < 50 and t2.e <= 3

postgres-# ;
  a | b  | c | e | a | b  | d | e

---+----+---+---+---+----+---+---
  2 | 20 | 2 | 2 | 2 | 20 | 2 | 2

(1 row)

postgres=# explain analyze select *

postgres-# from (

postgres(# select * from tmp1 where c >= 1

postgres(# ) t1 left join (

postgres(# select * from tmp2 where b < 30

postgres(# ) t2 on t1.a = t2.a

postgres-# and t2.d > 1 and t1.e >= 2

postgres-# where t1.b < 50 and t2.e <= 3

postgres-# ;
                                                  QUERY PLAN                                                 

-------------------------------------------------------------------------------------------------------------
  Hash Join  (cost=38.68..78.43 rows=18 width=32) (actual time=0.033..0.041 rows=1 loops=1)
    Hash Cond: ("outer".a = "inner".a)
    ->  Seq Scan on tmp1  (cost=0.00..38.53 rows=60 width=16) (actual time=0.007..0.011 rows=3 loops=1)
          Filter: ((c >= 1) AND (e >= 2) AND (b < 50))
    ->  Hash  (cost=38.53..38.53 rows=60 width=16) (actual time=0.008..0.008 rows=1 loops=1)
          ->  Seq Scan on tmp2  (cost=0.00..38.53 rows=60 width=16) (actual time=0.003..0.005 rows=1 loops=1)
                Filter: ((b < 30) AND (d > 1) AND (e <= 3))
  Total runtime: 0.070 ms

(8 rows)

postgres=#

SQL执行计划的分析:

1) 全表扫描左表TMP2,同时根据TMP2表子查询条件"B"<30和where过滤条件"TMP2"."E"<=3及ON子句过滤条件"TMP2"."D">1联合过滤,即filter("TMP2"."E"<=3 AND "TMP2"."D">1 AND "B"<30),计算结果临时表记为tmp1;

2) 全表扫描右表TMP1,同时根据TMP1表子查询条件"C">=1和where子句过滤条件"TMP1"."B"<50及ON子句"TMP1"."E">=2联合过滤,即filter("TMP1"."B"<50 AND "TMP1"."E">=2 AND "C">=1),计算结果临时表记为tmp2;

3) 临时表tmp1和tmp2通过access("TMP1"."A"="TMP2"."A")连接条件进行Hash Join连接操作(此处left join写法已经被转换为内链接),返回匹配结果临时表记为tmp3;

4) 返回结果集。

两个左连接SQL执行计划解析(Oracle和PGSQL对比):的更多相关文章

  1. 一个RDBMS左连接SQL执行计划解析

    1.测试数据如下: SQL> select * from t1;  a | b  | c ---+----+---  1 | 10 | 1  2 | 20 | 2  3 | 30 | 3  4 ...

  2. Oracle sql执行计划解析

    Oracle sql执行计划解析 https://blog.csdn.net/xybelieve1990/article/details/50562963 Oracle优化器 Oracle的优化器共有 ...

  3. sql执行计划解析案例(二)

    sql执行计划解析案例(二)   今天是2013-10-09,本来以前自己在专注oracle sga中buffer cache 以及shared pool知识点的研究.但是在研究cache buffe ...

  4. 表连接sql执行计划学习

    循环嵌套连接(Nested Loop Join) 合并连接(Merge Join) 哈西匹配(Hash Join) 文章:浅谈SQL Server中的三种物理连接操作 循环嵌套,如果内循环列上有索引, ...

  5. oracle sql 执行计划分析

    转自http://itindex.net/detail/45962-oracle-sql-%E8%AE%A1%E5%88%92 一.首先创建表 SQL> show user USER is &q ...

  6. 来自灵魂的拷问——知道什么是SQL执行计划吗?

    面试官说:工作这么久了,应该知道sql执行计划吧,讲讲Sql的执行计划吧! 看了看面试官手臂上纹的大花臂和一串看不懂的韩文,吞了吞口水,暗示自己镇定点,整理了一下思绪缓缓的对面试官说:我不会 面试官: ...

  7. Atitit sql执行计划

    Atitit sql执行计划 1.1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的 Oracle中的执行计划 ...

  8. [转载]循规蹈矩:快速读懂SQL执行计划的套路与工具

    作者介绍 梁敬彬,福富研究院副理事长.公司唯一四星级内训师,国内一线知名数据库专家,在数据库优化和培训领域有着丰富的经验.多次应邀担任国内外数据库大会的演讲嘉宾,在业界有着广泛的影响力.著有多本畅销书 ...

  9. EXPLAIN 查看 SQL 执行计划

    EXPLAIN 查看 SQL 执行计划.分析索引的效率: id:id 列数字越大越先执行: 如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. ...

随机推荐

  1. 引用变量&和指针*的区别

    &在C/C++中做右值时,为取地址运算符,来指示变量的地址.C++给&符号赋予了另外一个含义,将其用来声明引用. 引用变量的作用: 1.别名 int b = 0; int& a ...

  2. 爬虫-通过本地IP地址从中国天气网爬取当前城市天气情况

    1.问题描述 ​ 最近在做一个pyqt登录校园网的小项目,想在窗口的状态栏加上当天的天气情况,用爬虫可以很好的解决我的问题. 2.解决思路 ​ 考虑到所处位置的不同,需要先获取本地城市地址,然后作为中 ...

  3. SecureCRT的安装与破解(过程很详细!!!)

    SecureCRT的安装与破解(过程很详细!!!) 使用SecureCRT可以方便用户在windows环境下对linux主机进行管理,这里为大家讲一下SecureCRT的破解方法,仅供大家参考学习: ...

  4. JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)

     相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技术 ...

  5. django/python日志logging 的配置以及处理

    日志在程序开发中是少不了的,通过日志我们可以分析到错误在什么地方,有什么异常.在生产环境下有很大的用处.在java 开发中通常用 log4j,logback 等三方组件.那么在 django中是怎么处 ...

  6. mybatis基础知识

    一.什么是Mybatis 这里借用官网的一句话介绍什么是mybatis:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC ...

  7. 【原创】大数据基础之ElasticSearch(2)常用API整理

    Fortunately, Elasticsearch provides a very comprehensive and powerful REST API that you can use to i ...

  8. windows上安装gcc/g++环境(MinGW,msys64等)

    1 前言 经过折腾安装gcc环境,记录一下 2 工具  MinGW安装器: 下载地址1:MinGW官网 下载地址2:SourceForge (MinGW w64) 下载地址3:win-builds-1 ...

  9. 经测试,foreach循环比linq的效率高

  10. Jmeter性能测试之进阶BeanShell的使用

    BeanShell 最常用的用法 写好Java代码打成jar, 放到目录\lib\ext下面 package com.test; import java.io.File; import java.io ...