关于表联结方法(一)(r3笔记第57天)

时间:2022-05-04
本文章向大家介绍关于表联结方法(一)(r3笔记第57天),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

分类: Oracle

在sql语句中,如果from后面有多个表时,关于表的联结方法是很重要的一个环节。 大体有nested loop join,hash join,merge join -->nested loop join 这种场景一般适用于大表和小表的关联,一般来说小表适用做为驱动表,对于小表中的匹配记录和大表做关联,这个时候小表是在外部循环,大表在内部循环,小表中的匹配记录都和大表做一个关联。

SQL>  create table t as select *from dba_objects where object_id is not  null;
SQL> create table t1 as select *from user_objects where object_id is  not null;
SQL> exec  dbms_stats.gather_table_stats(user,'T',cascade=>TRUE);
SQL> exec  dbms_stats.gather_table_stats(user,'T1',cascade=>TRUE);
SQL> create  unique index ind_t on t(object_id);
SQL> create unique index int_t1 on  t1(object_id) ;
SQL> select  count(*)from t;
   COUNT(*)
----------
      10783

下面的例子,t1表中的数据较少,表t中的数据多,就以表t1位驱动表,走了全索引扫描查取到t1的数据,然后对于t1中的数据和t做匹配,匹配的时候走了唯一性扫描

-->hash join 这种场景适合于大表和大表之间的关联。通过hash算法来做两个表之间的匹配映射。

SQL> create table  t as select *from dba_objects where object_id is not null;
SQL> create  table t1 as select *from dba_objects where object_id is not null;
SQL>  exec dbms_stats.gather_table_stats(user,'T',cascade=>TRUE);
SQL> exec  dbms_stats.gather_table_stats(user,'T1',cascade=>TRUE);
SQL> create  unique index ind_t on t(object_id);
SQL> create unique index int_t1 on  t1(object_id) ;
SQL> select  count(*)from t;
   COUNT(*)
----------
      10783

对于表t1中的记录,都是通过hash映射来匹配t中的记录。可能对于cpu的资源消耗还是相对较多的,因为内部做了大量的计算。在生产环境中的实践来说,hash join还是不错的。特别是在和并行结合之后。