- 浏览: 1051065 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (1355)
- test (75)
- 红茶和绿茶 (1)
- Jave SE (206)
- Oracle (19)
- English (177)
- Log4j (5)
- RIA(Rich Internet Applications) (9)
- Ext Js (6)
- Android (14)
- Logo (0)
- 文字采撷 (287)
- 使用技巧 (92)
- Project Management (22)
- Hibernate (12)
- Struts (5)
- 规则引擎 (1)
- Html & Javasctipt (56)
- Spring MVC (10)
- Maven (17)
- Java Test (17)
- Linux (16)
- Tools (1)
- CV (0)
- Middleware (2)
- HTML5 (2)
- Algorithms (4)
- Web Service (15)
- 留学 (15)
- LADP (5)
- PXCOA (0)
- SysLog (6)
- SSO (3)
- Spring Security (4)
- Spring Batch (1)
- Jmail (1)
- Bible (4)
- Java Thread (5)
- Architect (6)
- github (2)
- Java Swing (12)
- NoSQL (7)
- UML (2)
- 敏捷(Agile) (7)
- Hudson+Maven+SVN (15)
- cloud computing (2)
- Bahasa Indonesia (1)
- jBPM (6)
- 民俗知识 (3)
- Consulting (1)
- Mysql (5)
- SAP (1)
- 微信公众平台接口开发 (3)
- 做生意 (1)
- 西餐 (1)
- Banking (1)
- Flex (0)
- 黄金投资 (1)
- Apache Tomcat 集群 (3)
- Hadoop (7)
- 需求分析 (1)
- 银行知识 (3)
- 产品管理 (2)
- 钢琴Music (3)
- 设计 (3)
- Marketing (2)
- US Life (3)
- 算法 (14)
- BigData (4)
- test红茶和绿茶Jave SEOracleEnglishLog4jRIA(Rich Internet Applications)Ext JsAndroidLogo文字采撷 (0)
- Design Pattern (5)
- NodeJS&AngularJS (9)
- Python (1)
- Spring boot (0)
- ACM (3)
最新评论
-
心往圣城:
微时代-最专业的微信第三方平台。LBS定位导航,微网站,自定义 ...
微信公众平台 /微信公众平台怎么用 -
zhaojiafan:
return ReverseStr1(str.substrin ...
逆转字符串 Write a String Reverser (and use Recursion!) -
zhaojiafan:
public class StringUtils {
p ...
逆转字符串 Write a String Reverser (and use Recursion!)
关系型并不是最早出现的数据库表现形式,之前还存在层次、网状数据库结构。随着关系型数据库的出现,以数据表的方式进行信息留存的方案迅速发展起来。关系型数据库的重要元素包括数据表和表连接,借助各种类型的表连接,可以将平铺直叙的信息加以组装拼接。
在Oracle数据库中,应对不同的连接情况和数据特征,数据库CBO会生成不同的执行计划和连接操作。本篇介绍各种连接中的一种——
嵌套循环Nest Loop Join是一种古老的连接方式。中的连接,本质上就是将两个数据集合依据连接条件进行匹配操作。Nest Loop Join就是通过两层循环手段进行依次的匹配操作,最后返回结果集合。SQL语句只是描述出希望连接的对象和规则,而执行计划和执行操作要切实将一行行的记录进行匹配。
Nest Loop Join的操作过程很简单,很想我们最简单的排序检索算法,两层循环结构。进行连接的两个数据集合(数据表)分别称为外侧表(驱动表)和内测表(被驱动表)。首先处理外侧表中每一行符合条件的数据,之后每一行数据和内测表进行连接匹配操作。最后可以获取到结果集合。
具体来说,Nest Loop Join的执行过程如下:
ü Oracle CBO首先将一系列的连接关系,拆分为若干层的Nest Loop Join,确定连接顺序。如a.field1=b.field1 and b.field2=c.field2,就可以组织成表A和表B先进行nest loop join操作,之后操作的结果集合再与数据表C进行nest loop join操作。所以,我们查看到的连接操作,通常都是分层次的;
ü 在确定每次Nest Loop Join的两端对象之后,确定外侧连接表和内侧连接表。将外侧连接表作为连接驱动表,根据SQL中对驱动表的连接条件,进行筛选。最后获取到驱动表数据集合;
ü 从驱动表每条记录入手,检索内侧表记录,获取符合连接条件的记录。形成连接行;
注意:此处有两个需要注意的问题。其一是驱动表的确定。另一个就是检索内侧表的方法。这两个问题在CBO时代的回答都是成本问题,Oracle通过成本试算获取到。对Nest Loop Join而言,条件列、连接列上的索引是会很大程度上影响执行计划的。
下面是一个SQL语句的执行计划,由于CBO操作的复杂性,本SQL使用hint来进行强制的Nest Loop路径。
SQL> create table tabs as select * from dba_tables;
Table created
SQL> create table cols as select owner,table_name, column_name, data_type from dba_tab_cols;
Table created
SQL> create idx_tabs_owner on tabs(owner);
Index created
SQL> create index idx_cols_name on cols(table_name);
Index created
SQL> set linesize 10000;
SQL> set pagesize 1000;
SQL> explain plan for select /*+use_nl(tabs,cols) */* from tabs, cols where tabs.table_name=cols.tab
le_name and tabs.owner='SCOTT';
已解释。
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 2834620917
------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1355 | 381K| 360 (0)| 00:00:05 |
| 1 | NESTED LOOPS | | | | | |
| 2 | NESTED LOOPS | | 1355 | 381K| 360 (0)| 00:00:05 |
| 3 | TABLE ACCESS BY INDEX ROWID| TABS | 117 | 28314 | 9 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | IDX_TABS_OWNER | 117 | | 1 (0)| 00:00:01 |
|* 5 | INDEX RANGE SCAN | IDX_COLS_NAME | 12 | | 2 (0)| 00:00:01 |
| 6 | TABLE ACCESS BY INDEX ROWID | COLS | 12 | 552 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("TABS"."OWNER"='SCOTT')
5 - access("TABS"."TABLE_NAME"="COLS"."TABLE_NAME")
已选择19行。
在执行计划中,伴随着两个Nest Loop Join。首先,通过条件owner=’SCOTT’,检索索引idx_tabs_owner,获取符合条件的rowid列表。之后利用rowid从tabs表中取出结果集合。这个集合就成为第一层Nest Loop Join的外侧表(Outer)。
第一层Nest Loop Join的两端外侧表是TABS结果集合,内侧表(集合)则是COLS数据表对应的索引IDX_COLS_NAME,进行匹配的条件是table_name相等。第一层Nest Loop Join的结果集合是TABS所有符合条件行字段,外加上对应COLS数据表的rowid。
第二层Nest Loop Join就是通过获取到的COLS rowid找到COLS记录的全部内容。
2、Nest Loop Join检索图示
下面通过一张示意,表达在没有连接列索引的情况下,Nest Loop Join的工作方式。
在没有索引的情况下,首先Oracle会检索驱动表外侧表(全表扫描),获取到符合外侧表单独条件的记录行集合(Row1和Row2)。
之后针对row1和row2,分别对inner表进行全表匹配查询,就是对每个outer的结果行,要进行inner表的所有块查询。最后发现符合条件的row3和row4,将结果返回。
通过图示,我们也可以发现Nest Loop Join的一个致命缺陷:存在大量的随机读。为一个outer行,就需要进行inner表的全表扫描。如果inner表很庞大,那么这个执行计划效率可想而知。
3、索引优化与Nest Loop Join
在目前的Oracle执行计划中,如果inner和outer表均没有索引等优化方式,而且不包含那些很复杂的连接对应条件,出现Nest Loop Join的机会还是很低的。因为Oracle CBO会选择其他替代执行计划(如Hash Join)来参与执行计划。
在条件列,特别是连接条件列上添加索引,可以大幅度的减少Nest Loop Join的随机读。见下图示意:
如果在inner表(或者outer)的连接条件列上添加索引,在进行Nest Loop Join的时候,Row1/Row2可以直接确定符合连接条件的Inner Table数据行对应的rowid。不需要直接对inner table进行检索,就可以获取到rowid了。由于索引对应的体积要远远小于Inner Table,所以进行的块读取要少很多。
结论:如果确定需要使用嵌套循环Nest Loop Join,那么最好考虑保证连接列上能存在索引对象。这样可以很大程度上提高Nest Loop Join的连接效率。
http://www.360doc.com/content/12/0415/11/5287961_203718572.shtml
发表评论
-
Oracle SGA 设置
2015-05-29 10:47 556首先想到的是经查SGA,shared pool C:\Doc ... -
listener could not find available handler with matching protocol stack
2015-05-28 10:46 1212oracle processes 在客户端进行sqlp ... -
Oracle删除库中所有表
2015-01-21 10:38 452select 'drop table ' ... -
Oracle用户权限
2014-08-19 09:34 582系统权限: 1、使用GRANT语句向用户赋予系统权 ... -
DBMS_Job包的用法
2014-07-14 09:03 5991.确保Oracle的工作模 ... -
export DB oracle and DB2
2014-04-29 10:45 0rem %1:导出备份文件名rem %2:导出备份日志文件名 ... -
oracle export DB
2014-04-27 11:48 501exp userid=feelview/feelview@ ... -
listener does not currently know of SID given in connect descriptor
2014-04-22 21:55 419listener does not currently k ... -
oracle hints
2012-10-22 10:15 907在向大家详细介绍Oracle ... -
hibernate hints oracle database
2012-10-19 14:46 917hibernate hints oracle database ... -
关于 varchar2 的最大长度
2011-10-27 11:51 3836关于 varchar2 的最大长度varchar2有两个最大长 ... -
Oracle %TYPE
2011-09-27 11:34 771Oracle %TYPE %TYPE 是定义变量的一种 ... -
Oracle 系统知识总结
2011-08-30 15:55 971◆Oracle查询用户表空间:select * from ... -
View Oracle table PK column
2011-08-25 10:29 744select a.OWNER 用户名, a.CONS ... -
Some important SQL about Oracle
2011-08-24 14:34 786--view system time sele ... -
Oracle数据库的一些常用操作经验总结
2011-08-24 11:50 1870一:数据库启动的步骤: ... -
获得单个表和索引DDL语句的方法:
2011-08-24 11:47 9981,获得单个表和索引DDL语句的方法 set headi ... -
NVARCHAR2和VARCHAR2的区别
2011-08-24 11:38 1012VARCHAR2是Oracle提供的特定数据类型,Oracle ... -
Oracle常用系统表
2011-08-23 18:40 759Oracle常用系统表 1.1 基 ...
相关推荐
Oracle 的三种表连接方式是指在做表 join 的时候, Oracle 有三种方式,分别是:sort merge join(SMJ) ·nest loop(NL) ·hash join(HJ)。下面是对这三种策略的详细讲解: sort merge join(SMJ) sort merge join ...
本文档主要讨论 Oracle 面试中的基础概念和执行计划,包括表连接方式、等连接、非等连接、自连接、外连接、hash join、merge join、nest loop、index join 等,并对各种连接方式进行了详细的解释和示例。 一、基础...
nest loop(cluster join)是一种基于循环的连接算法,用于连接两个表。 index join是一种基于索引的连接算法,用于快速连接两个表。 六、Oracle 8i、9i 表连接方法 Oracle 8i和9i提供了多种表连接方法,包括等...
1. **表连接方式**:Oracle支持多种连接方式,如哈希连接(Hash Join)、合并连接(Merge Join)、嵌套循环连接(Nest Loop,也称为Cluster Join)和索引连接(Index Join)。哈希连接通过创建哈希表来匹配数据;...
在 Oracle 中,表连接方式有多种,包括 Hash Join、Merge Join、Nest Loop(Cluster Join)和 Index Join。每种连接方式都有其特点和应用场景,了解这些连接方式可以帮助 DBA 选择合适的连接方式来提高查询性能。 ...
在 Oracle 中,存在多种表连接方式,如 Hash Join、Merge Join、Nest Loop Join、Index Join 等。选择合适的连接方式可以大大提高查询性能。 四、使用 CBO 优化器 CBO(Cost-Based Optimizer)是 Oracle 中的一种...
1. **表连接方式**:Oracle支持多种表连接方式,包括哈希连接(Hash Join)、合并连接(Merge Join)、嵌套循环连接(Nest Loop,也称为Cluster Join)和索引连接(Index Join)。每种连接方式都有其适用场景,比如...
- **Nest Loop Join:** 这种连接方式适用于小表与大表之间的连接,通过嵌套循环的方式逐一比较两表中的每一行数据,效率较低但适合小数据量。 - **Hash Join:** 基于散列表的连接方式,适用于大数据量的表连接,先...
hash join/merge join/nest loop(cluster join)/index join 2:不借助第三方工具,怎样查看sql的执行计划 set autot on explain plan set statement_id = &item_id for &sql; select * from table(dbms_...
1. Nest-Loop:嵌套循环连接,适用于小表连接大表的情况。 2. Merge Join:归并连接,利用排序后的数据进行连接,适合已排序的输入。 3. Hash Join:哈希连接,通过创建哈希表来快速匹配行,适用于内存充足的情况...
hash join/merge join/nest loop(cluster join)/index join 2:不借助第三方工具,怎样查看sql的执行计划 set autot on explain plan set statement_id = &item_id for &sql; select * from table(dbms...
如果这个等待事件比较显著,可能表示在多表连接中,表的连接顺序存在问题,可能没有正确的使用驱动表;或者可能说明不加选择地进行索引。在大多数情况下我们说,通过索引可以更为快速的获取记录,所以对于一个编码...
- **Hash Join / Merge Join / Nest Loop (Cluster Join) / Index Join**:这些是不同的物理连接方法,Oracle会根据具体情况选择最合适的连接算法。 - **Hash Join**:适用于大型表之间的连接,通过创建哈希表来...
- **Nest Loop**:通过嵌套循环的方式进行连接。 - **Hash Join**:通过构建哈希表进行连接。 #### 58. DB File Sequential Read与DB File Scattered Read的区别 - **DB File Sequential Read**:顺序读取文件中的...
- Nest Loop与Hash Join是两种不同的连接操作,Nest Loop适合小数据集,Hash Join适合大数据集且能有效利用内存。 - DB File Sequential Read和Scattered Read等待事件与I/O性能有关,过多可能表示I/O子系统瓶颈。 -...
当我们提到SQL语句的执行时,往往会涉及到诸如索引扫描、驱动表的选择、连接策略(如Nest Loop Join或Hash Join)等概念。这些细节可以通过执行计划(Execution Plan)来查看,但执行计划本身是如何生成的呢?本文将...
1. **表连接方式**:SQL中的表连接主要有四种类型:哈希连接(Hash Join)、归并连接(Merge Join)、嵌套循环连接(Nest Loop,也称为Cluster Join)和索引连接(Index Join)。每种连接方式都有其适用场景,DBA...
- **Nest Loop**:适用于小表连接大表,且大表有索引的情况。先处理小表,然后根据小表的结果逐行查询大表,效率较高。 - **Hash Join**:适用于两表连接且预计返回大量结果的情况。通过建立哈希表来优化连接操作,...