oracle表之间的内部连接可分为三种方式:
(1)nested loop join--嵌套连接
(2)sort merge join--排序合并连接
(3)hash join--哈希连接
下面分别介绍这三种内部连接方式及优缺点:
(1)nested loop join
oracle优化器根据CBO或者RBO选择驱动表作为外部表,从外部表的关联列上的第一行开始,逐步与内部表关联列的每一行进行对比,将匹配的结果放入结果集;继续外部表的第二行。。直到最后一行,产生所有结果集。
基于CBO的优化器会选择合适的表作为驱动表。同时也可以用RBO手动添加hints,进行指定:/*+ use_nl(a,b) */
条件:内部表的关联列上存在索引,且两个表的数据较少时。
优点:可以先返回一部分数据,而无需等待全部集合。
(2)sort merge join
oracle优化器选择一个源表作为外部表,对关联列进行排序;然后对内部表的关联列进行排序,最后进行合并操作,产生结果集。
可以手动添加hints:/*+ use_merge(a,b) */来指定连接方式。
条件:无索引时,或者两个表的数据较大。
缺点:由于涉及排序,所以对PGA要求较高,当PGA不够时,会用到临时表空间。
(3)hash join
oracle优化器选择外部表,将关联列的数据全部cache到内存,形成hash表;然后再将内部表的关联列cache到内存,比较后产生结果集。
条件:用于等值连接且两个表数据量较大时。
缺点:对PGA要求较高。
下面对比这几种连接方式:
oracle表的连接类型,在sql写法上分为以下几种:
(1)inner join--内连接
(2)left (outer) join--左外连接
(3)right (outer) join--右外连接
下面对这几种连接方式做出说明:
(1)inner join
写法:select * from A inner join B on A.col=B.col;
等价于:select * from A,B where A.col=B.col;
(2)left outer join
写法:select * from A left join B on A.col=B.col;
(3)right outer jon
写法:select * from A right join B on A.col=B.col;
总结:
oracle优化是一个系统工程,对于sql的优化,可以参考的内容包括查看sql的执行计划(set autotrace trace only),通过执行计划查看表连接的方式,同时确定索引的使用情况。对于索引的有效性,可以查看视图(V$object_usage)。
oracle每天晚上十点(默认),开始执行job,来收集对象(表、索引)的统计信息,可以通过查看dba_tables或者dba_indexes视图来查看统计信息的收集情况。可以查看表的平均行长,块的大小以及最后分析时间来确定。
一个sql语句是否应该使用索引,可以做一个sql access advisor来确定。
总之,多表之间的关联,容易造成sql执行时间过长,此时,分析表间的关联方式,以及执行计划情况,是一个不错的研究出发点。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26511146/viewspace-745511/
,如需转载,请注明出处,否则将追究法律责任。