SQL优化之表连接方式

1.嵌套循环(DESTED LOOPS)

Note:嵌套循环被驱动表必须走索引,而且索引只能走INDEX UNIQUE SCAN或者INDEX RANGE SCAN

SQL> select /*+gather_plan_statistics use_nl(e,d) leading(e)*/* from emp e,dept d where d.deptno=e.deptno;

已选择14行。

执行计划
----------------------------------------------------------
Plan hash value: 3625962092

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

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

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

|   0 | SELECT STATEMENT             |         |    14 |   812 |    17   (0)| 00:00:01 |

|   1 |  NESTED LOOPS                |         |       |       |            |
       |

|   2 |   NESTED LOOPS               |         |    14 |   812 |    17   (0)| 00:00:01 |

|   3 |    TABLE ACCESS FULL         | EMP     |    14 |   532 |     3   (0)| 00:00:01 |

|*  4 |    INDEX UNIQUE SCAN         | PK_DEPT |     1 |       |     0   (0)| 00:00:01 |

|   5 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    20 |     1   (0)| 00:00:01 |

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

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("D"."DEPTNO"="E"."DEPTNO")

统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
         26  consistent gets
          0  physical reads
          0  redo size
       2035  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)
         14  rows processed

SQL> select /* use_nl(d,e) leading(e) */
 * from dept d
 left join emp e on d.deptno=e.deptno;

已选择15行。

执行计划
----------------------------------------------------------
Plan hash value: 2251696546

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

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

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

| 0 | SELECT STATEMENT | | 14 | 812 | 6 (17)| 00:00:01 |

| 1 | MERGE JOIN OUTER | | 14 | 812 | 6 (17)| 00:00:01 |

| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 4 | 80 | 2 (0)| 00:00:01 |

| 3 | INDEX FULL SCAN | PK_DEPT | 4 | | 1 (0)| 00:00:01 |

|* 4 | SORT JOIN | | 14 | 532 | 4 (25)| 00:00:01 |

| 5 | TABLE ACCESS FULL | EMP | 14 | 532 | 3 (0)| 00:00:01 |

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

Predicate Information (identified by operation id):
---------------------------------------------------

4 - access("D"."DEPTNO"="E"."DEPTNO"(+))
filter("D"."DEPTNO"="E"."DEPTNO"(+))

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

SQL> select /* use_nl(d,e) leading(e) */
 * from dept d
 left join emp e on d.deptno=e.deptno
 where e.sal<3000;

已选择11行。

执行计划
----------------------------------------------------------
Plan hash value: 844388907--------------------------------------------------------------------------------

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

| 0 | SELECT STATEMENT | | 7 | 406 | 6 (17)| 00:00:01 |

| 1 | MERGE JOIN | | 7 | 406 | 6 (17)| 00:00:01 |

| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 4 | 80 | 2 (0)| 00:00:01 |

| 3 | INDEX FULL SCAN | PK_DEPT | 4 | | 1 (0)| 0000:01 |

|* 4 | SORT JOIN | | 7 | 266 | 4 (25)| 00:00:01 |

|* 5 | TABLE ACCESS FULL | EMP | 7 | 266 | 3 (0)| 00:00:01 |

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

Predicate Information (identified by operation id):
---------------------------------------------------

4 - access("D"."DEPTNO"="E"."DEPTNO")
filter("D"."DEPTNO"="E"."DEPTNO")
5 - filter("E"."SAL"<3000)

统计信息
----------------------------------------------------------
1 recursive calls
0 db block gets
11 consistent gets
0 physical reads
0 redo size
1756 bytes sent via SQL*Net to client
524 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
11 rows processed

SQL> select /*+leading(e) use_nl(d,e) */
 * from dept d
 left join emp e on d.deptno=e.deptno
 where e.sal<3000;

已选择11行。

执行计划
----------------------------------------------------------
Plan hash value: 3625962092

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

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

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

| 0 | SELECT STATEMENT | | 7 | 406 | 10 (0)| 00:00:01 |

| 1 | NESTED LOOPS | | | | |
|

| 2 | NESTED LOOPS | | 7 | 406 | 10 (0)| 00:00:01 |

|* 3 | TABLE ACCESS FULL | EMP | 7 | 266 | 3 (0)| 00:00:01 |

|* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 00:00:01 |

| 5 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 20 | 1 (0)| 00:00:01 |

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

Predicate Information (identified by operation id):
---------------------------------------------------

3 - filter("E"."SAL"<3000)
4 - access("D"."DEPTNO"="E"."DEPTNO")

统计信息
----------------------------------------------------------
1 recursive calls
0 db block gets
23 consistent gets
0 physical reads
0 redo size
1853 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)
11 rows processed

原文地址:https://www.cnblogs.com/wongandy/p/11337211.html

时间: 2024-10-11 04:15:28

SQL优化之表连接方式的相关文章

sql数据库的表连接方式图文详解

sql数据库表连接,主要分为:内连接.外连接(左连接.右连接 .全连接).交叉连接,今天统一整合一下,看看他们的区别. 首先建表填充值. 学生表:student(id,姓名,年龄,性别 ) 成绩表:score(id,学生id,成绩) 一.内连接(inner join……on) select student.* ,Score.* from student inner join Score on student.id=Score.sid 查询结果如下: 关系如下图: 总结:inner join取两表

sql sever 2008表连接方式总结

use master go if exists(select * from sysdatabases where name = '学生管理系统') drop database 学生管理系统 create database 学生管理系统 on primary ( name = '学生管理系统_data', filename = 'E:\temp\学生管理系统_data.mdf', size = 10MB, filegrowth = 1MB ) log on ( name = '学生管理系统_log

深入理解Oracle表(3):三大表连接方式详解之Nested loop join和 Sort merge join

深入理解Oracle表(3):三大表连接方式详解之Nested loop join和 Sort merge join 分类: Oracle 基础管理 Oracle SQL 开发2013-01-28 00:33 2536人阅读 评论(1) 收藏 举报 关系数据库技术的精髓就是通过关系表进行规范化的数据存储       并通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理       这里Think愿意和大家一起来学习分享Oracle的三大表连接技术              在早期版本,

表连接方式

--表连接方式1.Hash join:优化器使用两个表中较小的表(或数据源)利用连接键(HASH KEY)在内存中建立散列表(HASH表),然后扫描较大的表并探测散列表,找出与散列表匹配的行.如果hash表太大则无法在内存中完全放入,这时候优化器就分成不同区,把不能放入内存的分区放入到磁盘临时段,此时有较大的临时段来提高i/o性能.默认值指定方式:USE_HASH(table_name1 table_name2) 2.Nested loops:工作方式是从一张表(驱动表outer table,结

关联操作方式(表连接方式)

NESTED LOOPS(嵌套循环连接) 在嵌套循环连接中,oracle从第一个行源中读取第一行,然后和第二个行源中的数据进行对比. 所有匹配的记录放在结果集中,然后Oracle将读取第一个行源中的下一行.按这种方式直至第一个数据源中的所在行都经过处理. 第一个记录源通常称为外部表,或者驱动表,相应的第二个行源称为内部表.使用嵌套循环连接是一种从连接结果中提取第一批记录的最快速的方法. 在驱动行源表(就是您正在查找的记录)较小.或者内部行源表已连接的列有惟一的索引或高度可选的非惟一索引时, 嵌套

数据库多表连接方式介绍-HASH-JOIN

1.概述 hash join是一种数据库在进行多表连接时的处理算法,对于多表连接还有两种比较常用的方式:sort merge-join 和 nested loop. 为了比较清楚的介绍hash join的使用场景以及为何要引入这样一种连接算法,这里也会顺带简单介绍一下上面提到的两种join方式. 连接方式是一个什么样的概念,或者说我们为何要有而且有好几种,对于不太了解数据库的人来讲可能这些是开头的疑惑.简单来讲,我们将数据存在不同的表中,而不同的表有着它们自身的表结构,不同表之间可以是有关联的,

oracle多表连接方式Hash Join Nested Loop Join Merge Join

在查看sql执行计划时,我们会发现表的连接方式有多种,本文对表的连接方式进行介绍以便更好看懂执行计划和理解sql执行原理. 一.连接方式:        嵌套循环(Nested  Loops (NL))      (散列)哈希连接(Hash Join (HJ))    (归并)排序合并连接(Sort Merge Join (SMJ) ) 二.连接说明:    1.Oracle一次只能连接两个表.不管查询中有多少个表,Oracle 在连接中一次仅能操作两张表.    2.当执行多个表的连接时,优化

SQL语句多表连接查询语法

一.外连接 1.左连接  left join 或 left outer join SQL语句:select * from student left join score on student.Num=score.Stu_id; 2.右连接  right join 或 right outer join SQL语句:select * from student right join score on student.Num=score.Stu_id; 3.完全外连接  full join 或 full

Oracle 表连接方式(1)---

Oracle 表之间的连接分为三种: 1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两表都不加限制) 3. 自连接(同一张表内的连接) SQL的标准语法: select table1.column,table2.column from table1 [inner | left | right | full ] join table2 on table1.column1 = table2.column2; in