1、测试数据如下:

SQL> select * from t1;
  a | b  | c

---+----+---
  1 | 10 | 1
  2 | 20 | 2
  3 | 30 | 3
  4 | 40 | 4
  5 | 50 | 5
  6 | 60 | 6

(6 rows)

SQL> select * from t2;
  a | b  | d

---+----+---
  1 | 10 | 1
  2 | 20 | 2
  3 | 30 | 3

(3 rows)

2、解析示例SQL 如下 :

select *

from (

select * from t1 where c >= 2

) t1 left join (

select * from t2 where b < 30

) t2 on t1.a = t2.a

and t2.d > 1

where t1.b < 50

;

3、Oracle数据库查看执行结果及执行计划:

SQL> select *

from (

select * from t1 where c >= 2

) t1 left join (

select * from t2 where b < 30

) t2 on t1.a = t2.a

and t2.d > 1

where t1.b < 50

;

A        B           C      A         B        D

---------- ---------- ---------- ---------- ---------- ----------
      2       20           2      2        20        2
      3       30           3
      4       40           4

Execution Plan

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

Plan hash value: 1823443478

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

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

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

|   0 | SELECT STATEMENT   |      |    3 |   234 |    7  (15)| 00:00:01 |

|*  1 |  HASH JOIN OUTER   |      |    3 |   234 |    7  (15)| 00:00:01 |

|*  2 |   TABLE ACCESS FULL| T1   |    3 |   117 |    3   (0)| 00:00:01 |

|*  3 |   TABLE ACCESS FULL| T2   |    1 |    39 |    3   (0)| 00:00:01 |

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

Predicate Information (identified by operation id):

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

1 - access("T1"."A"="T2"."A"(+))
    2 - filter("T1"."B"<50 AND "C">=2)
    3 - filter("T2"."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
     926  bytes sent via SQL*Net to client
     523  bytes received via SQL*Net from client
       2  SQL*Net roundtrips to/from client
       0  sorts (memory)
       0  sorts (disk)
       3  rows processed

4、PGSQL数据库查看执行结果及执行计划:
      

postgres=# select *

postgres-# from (

postgres(# select * from t1 where c >= 2

postgres(# ) t1 left join (

postgres(# select * from t2 where b < 30

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

postgres-# and t2.d > 1

postgres-# where t1.b < 50

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

---+----+---+---+----+---
  2 | 20 | 2 | 2 | 20 | 2
  3 | 30 | 3 |   |    | 
  4 | 40 | 4 |   |    | 

(3 rows)

postgres=# explain analyze select *

postgres-# from (

postgres(# select * from t1 where c >= 2

postgres(# ) t1 left join (

postgres(# select * from t2 where b < 30

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

postgres-# and t2.d > 1

postgres-# where t1.b < 50

postgres-# ;
                                                  QUERY PLAN                                                

------------------------------------------------------------------------------------------------------------
  Hash Left Join  (cost=37.04..85.88 rows=197 width=24) (actual time=0.020..0.027 rows=3 loops=1)
    Hash Cond: ("outer".a = "inner".a)
    ->  Seq Scan on t1  (cost=0.00..36.55 rows=197 width=12) (actual time=0.005..0.008 rows=3 loops=1)
          Filter: ((c >= 2) AND (b < 50))
    ->  Hash  (cost=36.55..36.55 rows=197 width=12) (actual time=0.006..0.006 rows=1 loops=1)
          ->  Seq Scan on t2  (cost=0.00..36.55 rows=197 width=12) (actual time=0.002..0.003 rows=1 loops=1)
                Filter: ((b < 30) AND (d > 1))
  Total runtime: 0.052 ms

(8 rows)

5、MySQL数据库查看执行结果及执行计划:
      

mysql> select *
     -> from (
     -> select * from t1 where c >= 2
     -> ) t1 left join (
     -> select * from t2 where b < 30
     -> ) t2 on t1.a = t2.a
     -> and t2.d > 1
     -> where t1.b < 50
     -> ;

+---+----+---+------+------+------+

| a | b  | c | a    | b    | d    |

+---+----+---+------+------+------+

| 2 | 20 | 2 |    2 |   20 |    2 |

| 3 | 30 | 3 | NULL | NULL | NULL |

| 4 | 40 | 4 | NULL | NULL | NULL |

+---+----+---+------+------+------+

3 rows in set (0.05 sec)

mysql> explain select *
     -> from (
     -> select * from t1 where c >= 2
     -> ) t1 left join (
     -> select * from t2 where b < 30
     -> ) t2 on t1.a = t2.a
     -> and t2.d > 1
     -> where t1.b < 50
     -> ;

+----+-------------+------------+------+---------------+-------------+---------+------+------+-------------+

| id | select_type | table      | type | possible_keys | key         | key_len | ref  | rows | Extra       |

+----+-------------+------------+------+---------------+-------------+---------+------+------+-------------+

|  1 | PRIMARY     | <derived2> | ALL  | NULL          | NULL        | NULL    | NULL |    6 | Using where |

|  1 | PRIMARY     | <derived3> | ref  | <auto_key0>   | <auto_key0> | 8       | t1.a |    1 | Using where |

|  3 | DERIVED     | t2         | ALL  | NULL          | NULL        | NULL    | NULL |    3 | Using where |

|  2 | DERIVED     | t1         | ALL  | NULL          | NULL        | NULL    | NULL |    6 | Using where |

+----+-------------+------------+------+---------------+-------------+---------+------+------+-------------+

4 rows in set (0.00 sec)

6、针对以上SQL执行计划的分析:

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

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

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

4) 返回结果集。

7、一些更为复杂得SQL如下,有兴趣自行研究:

1) 测试数据

create table tmp1 as

select a,b,c,a as e from t1;

create table tmp2 as

select a,b,d,a as e from t2;

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

;

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

;

最新文章

  1. C语言 &#183; 未名湖边的烦恼
  2. mac下mysql的安装
  3. Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形) .
  4. PHP开发框架[流行度排名]
  5. easily add files to META-INF in NetBeans
  6. javascript删除目标标签
  7. IIS principle
  8. acdream暴力专场中的优美暴力
  9. Eva&#39;s Problem
  10. 启动ipython notebook(jupyter)
  11. IOS9.0 之后友盟分享详细过程
  12. python 循环语句 函数 模块
  13. ESP8266-Arduino杀手?
  14. THEKEY
  15. springboot自带定时任务和集成quartz
  16. 【mybatis源码学习】mybtias扩展点
  17. Zookeeper C++编程实战之配置更新
  18. 人类又被AI碾压,这次是星际争霸
  19. [Windows Azure] About Affinity Groups for Virtual Network
  20. snapshot相关

热门文章

  1. pythonのsqlalchemy多对多关系
  2. sqlserver 迁移
  3. $a=[1,2,3,4,5]; $b=[a,b,c,d,e]; 转成[[1,a],[2,b],[3,c],[4,d],[5,3]]
  4. flume taidir to kafkasink
  5. 初学python之路-day01
  6. javascript中数组的方法
  7. 简单检测PHP运行效率脚本
  8. Angular路由——辅助路由
  9. Burnside引理与Polya定理 学习笔记
  10. BZOJ4503 两个串 多项式 FFT