您好,欢迎访问一九零五行业门户网

排序合并连接(sort merge join)的原理

这三类表连接方式是oracle最基本的连接方式:嵌套循环连接(nested loops join)原理 哈希连接(hash join) 原理 排序合并连接(sor
这三类表连接方式是oracle最基本的连接方式:
嵌套循环连接(nested loops join)原理
哈希连接(hash join) 原理
排序合并连接(sort merge join)
访问次数:两张表都只会访问0次或1次。
驱动表是否有顺序:无。
是否要排序:是。
应用场景:当结果集已经排过序。
排序合并连接原理:如果a表的数据为(2,1,4,5,2),b表的数据为(2,2,1,3,1) ,首先将a表和b表全扫描后排序,如下:
a b
1 1
2 1
2 2
4 2
5 3
因为没有驱动表,所以oracle会随机选择一张表驱动,如果选择了a扫描到1,然后扫描b,当扫描=1的时候则管理,当扫描到b=2时,再以b=2为驱动扫描a表,不是从1开始扫,而是从2开始扫描,,交替的进行扫描、关联。
下面我们来做个试验:
sql> set linesize 1000
sql> drop table test1 purge;
sql> drop table test2 purge;
sql> create table test1 as select * from dba_objects where rownum sql> create table test2 as select * from dba_objects where rownum sql> exec dbms_stats.gather_table_stats(user,'test1');
sql> exec dbms_stats.gather_table_stats(user,'test2');
sql> alter session set statistics_level=all;
sql> select /*+ ordered use_merge(t2)*/count(*)
from test1 t1, test2 t2
where t1.object_id = t2.object_id;
count(*)
----------
100
sql> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
plan_table_output
-------------------------------------
sql_id f8ffscp1kugv4, child number 0
-------------------------------------
select /*+ ordered use_merge(t2)*/count(*) from test1 t1, test2 t2 where t1.object_id = t2.object_id
plan hash value: 737852259
----解释一下:
starts为该sql执行的次数。
e-rows为执行计划预计的行数。
a-rows为实际返回的行数。a-rows跟e-rows做比较,就可以确定哪一步执行计划出了问题。
a-time为每一步实际执行的时间(hh:mm:ss.ff),根据这一行可以知道该sql耗时在了哪个地方。
buffers为每一步实际执行的逻辑读或一致性读。
reads为物理读。
omem、1mem为执行所需的内存评估值,0mem为最优执行模式所需内存的评估值,1mem为one-pass模式所需内存的评估值。
0/1/m 为最优/one-pass/multipass执行的次数。
used-mem耗的内存
-------------------------------------------------------------------------------------------------------------------
| id | operation | name | starts | e-rows | a-rows | a-time | buffers | omem | 1mem | used-mem |
-------------------------------------------------------------------------------------------------------------------
| 1 | sort aggregate | | 1 | 1 | 1 |00:00:00.01 | 19 | | | |
| 2 | merge join | | 1 | 100 | 100 |00:00:00.01 | 19 | | | |
| 3 | sort join | | 1 | 100 | 100 |00:00:00.01 | 4 | 2048 | 2048 | 2048 (0)|
| 4 | table access full| test1 | 1 | 100 | 100 |00:00:00.01 | 4 | | | |
|* 5 | sort join | | 100 | 1000 | 100 |00:00:00.01 | 15 | 73728 | 73728 | |
| 6 | table access full| test2 | 1| 1000 | 1000 |00:00:00.01 | 15 | | | |
-------------------------------------------------------------------------------------------------------------------
predicate information (identified by operation id):
---------------------------------------------------
5 - access(t1.object_id=t2.object_id)
filter(t1.object_id=t2.object_id)
sql> select /*+ ordered use_merge(t2)*/count(*)
from test1 t1, test2 t2
where t1.object_id = t2.object_id
and t1.object_id = 99999;
count(*)
----------
0
更多详情见请继续阅读下一页的精彩内容:
其它类似信息

推荐信息