一、表的连接
表的连接是指在一个SQL语句中通过表与表之间的关联,从一个或多个表检索出相关的数据。连接是通过SQL语句中FROM从句的多个表名,以及WHERE从句里定义的表之间的连接条件来实现的。如果一个SQL语句的关联表超过两个,那么连接的顺序如何呢?ORACLE首先连接其中的两个表,产生一个结果集;然后将产生的结果集与下一个表再进行关联;继续这个过程,直到所有的表都连接完成;最后产生所需的数据。下面都以两个表的连接为例:
createtableuser_info(user_namechar(10),user_idchar(10));
createtabledev_info(dev_nochar(10),user_idchar(10),dev_typechar(10));
说明和分析表的各种连接方式。
ORACLE从6的版本开始,优化器使用4种不同的表的连接方式:嵌套循环连接(NESTEDLOOPJOIN)
群集连接(CLUSTERJOIN)
排序合并连接(SORTMERGEJOIN)
笛卡尔连接(CARTESIANJOIN)
ORACLE7.3中,新增加了哈希连接(HASHJOIN)
在ORACLE8中,新增加了索引连接(INDEXJOIN)
这六种连接方式都有其独特的技术特点,在一定的条件下,可以充分发挥高效的性能。
但是也都有其局限性,如果使用不当,不仅不能提高效率,反而会严重影响系统的性能。因此,深入地探讨连接方式的内部运行机制对于性能优化是必要的。
1、嵌套循环连接
嵌套循环连接的内部处理的流程:
1)Oracle优化器根据基于规则RBO(rulebasedoptimizer)或基于成本CBO(costbasedoptimizer)的原则,选择两个表中的一个作为驱动表,并指定其为外部表。
2)Oracle优化器再将另外一个表指定为内部表。
3)Oracle从外部表中读取第一行,然后和内部表中的数据逐一进行对比,所有匹配的记录放在结果集中。
4)Oracle读取外部表中的第二行,再和内部表中的数据逐一进行对比,所有匹配的记录添加到结果集中。
5)重复上述步骤,直到外部表中的所有纪录全部处理完。
6)最后产生满足要求的结果集。
通过查询SQL语句的执行计划可以看出哪个表是外部表,哪个为内部表。
如selecta.user_name,b.dev_nofromuser_infoa,dev_infobwherea.user_id&#