详解SQL中几种常用的表连接方式.docx
《详解SQL中几种常用的表连接方式.docx》由会员分享,可在线阅读,更多相关《详解SQL中几种常用的表连接方式.docx(11页珍藏版)》请在第壹文秘上搜索。
1、多表关联查询,查询优化器的执行步骤具体如下。1)访问路径:查询语句中涉及多个对象,可以基于成本确定每一个对象数据的检索方式,是选择全表扫描还是索引访问等。2)连接方式:结果集之间的关联方式,主要包括嵌套循环、哈希连接、排序合并连接等。优化器对结果集之间连接方式的判断尤为重要,因为判断结果将会直接影响SQL的执行效率。3)关联顺序:当关联对象超过2个时,首先选取两个对象关联得到的结果集,再与第三个结果集相关联。下面我们重点介绍几种常见的连接方式。Ol嵌套循环连接图1所示的是嵌套循环连接示意图。OuterInputInnerInput图1嵌套循环连接示意图嵌套循环查询流程具体如下。1)两表关联,优
2、化器首先会确定驱动表,也称外部表(outertable),另一张则是被驱动的表,也称为内部表(innertable)一般情况下,优化器会把数据量小的定义为驱动表,执行计划中,驱动表在上,被驱劫表在下。2)驱动表确认之后,会从其中提取一行有效数据,在被驱动表(内部表)中查找和匹配有效数据并提取。3)将数据返回给客户端。从以上步骤中我们可以看出,驱动表返回的行数直接影响了被驱动表的访问次数,比如,驱动表根据筛选条件最终返回了1()行有效数据,每返回一条就会传值给被驱动表进行匹配,驱动表一共需要循环访问10次。示例代码如下:SQLSELECT/*+USE_NL(ed)*/e.firSjname,e.
3、last_name,e,salary,d.department_nameFROMhr.employeese,hr.departmentsdWHERECLdepartmenJnameIN(Marketing,Sales)ANDe.department_id=d.department_id;SQLSeleet*fromtab【e(dbms_xplan.D工SPLAY_CURSOR(rwll,null,,ALLSTATSLAST,);SQL_ID_3nsghdhl50bx5jchildnumber0SELECT/*+USE_NL(ed)*/e.first-nameje.Iastjame,e.sala
4、ryjd.department_nameFROMhr.employeese,hr.departmentsdWHEREd.depaname工N(Marketing,Sales)ANDe,department_idd.department_idPlanhashvalue:2968905875IdIOPeratiOnINameIStartSlE-RoWSlA-RowsATimeIBuffersI0ISELECTSTATEMENT136100:00:00.01I23厂I1INESTEDLPS11936100:00:00.01I23J*2ITABLEACCESSFULL!DEPARTMENTS122j0
5、0:0。f0.01I8IPTTTABLEACCESSFULLEMPLOYEESj103600:00:00.01I15I从上述示例代码中我们可以看出,DEPARTMENTS为驱动表,StanS为1,说明只访问1次,返回2行有效数据(A-ROWS为实际返回的行数),EMPLOYEES为被驱动表,StartS为2,说明访问2次。学过C+编程的同学应该记得,C+中的嵌套循环与下面的循环有些类似:#includeintmain()Uiti,j;for(i=l;i100;i+)for(j=l;j(i/j?)pitf(dn,i)7return0;j的循环次数取决于i的取值范围,我们可以将i看作驱动表,j看作
6、被驱动表。嵌套循环连接性能主要受限于以下几点。- 驱动表的返回行数。- 被驱动表的访问方式:如果被驱动表的连接列基数小且选择性差,会导致全表扫描的访问方式,其效率变得非常低,所以我们建议连接列存在索引,且基数大选择性高。- 驱动表筛选后将返回少量数据。- 被驱动表关联字段需要有索引(连接列基数较大或选择性较高)。- 两表关联后将返回少量数据。- 适合于OLTP系统。Tips如果优化器选择了错误的连接方式,那么我们可以使用提示(hint)强制执行使用嵌套循环的连接方式:“/*+USE_NL(TABLE1,TABLE2)LEADING(TABLE1)*,其中TABLEl和TABLE2为关联表的别名
7、,LEADlNG(TABLEl)用于将TABLEl指定为驱动表。02哈希连接图2所示的是哈希连接示意图。图2哈希连接示意图Rfl哈希函数哈希函数嵌套循环连接适用于两表关联后将返回少量数据的情况,那么返回大盘数据时该采用哪种连接方式呢?答案是采用哈希连接。哈希连接的查询流程具体如下。1)两表等值关联。2)优化器将数据量小的表作为驱动表,在PGA的SQL工作区域(workareas)中,将驱动表的连接列构建成一张哈希表。3)读取大表,对连接列进行哈希运算(检查哈希表,以查找连接的行)。4)将数据返回给客户端。从以上步骤中我们可以看出,通过哈希值进行匹配的方式,更适用于两表等值关联。示例代码如下:S
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 详解 SQL 中几种 常用 连接 方式
