oracle多表連線分為三大類:next loop、sort merge、hash join。
每一類又分為三小類,有傳統連線,semi join, anti join。(後兩種叫做半連線)
nest loop方式:
有兩個表,驅動表driving table,被驅動表driven table。
驅動表做一次遍歷,被驅動表做多次遍歷。
返回第一條記錄速度很快,不需要排序。
可以使用非等值連線。
sort merge方式:
兩個表地位一樣。每個表都要先排序,然後進行合併,返回記錄集。
排序首先在記憶體中進行,能在記憶體中完成的叫做optimal sort,也叫in-memory sort。如果需要借助磁碟緩衝,叫做外部排序external sort。
在外部排序中,執行run是指一次對磁碟做io。
如果一次輸入就能完成整個資料集的排序叫做1路排序1-pass sort。需要多次輸入輸出操作的叫多路排序multi-pass sort。
從效能角度來看optimal sort>1-pass sort>multi-pass sort
執行計畫中
omem:代表使用optimal排序需要的記憶體估量。
1mem:代表使用1-pass排序需要的記憶體估量。
o/1/m:代表實際optimal、1-pass、multi-pass方式的執行次數。
hash join方式:
乙個驅動表,乙個被驅動表。過程有兩個階段:
準備階段:對驅動表的連線字段進行雜湊操作,產生一系列的hash bucket(雜湊桶)
探測階段:依次上去被驅動表每條記錄,對連線字段執行相同雜湊函式,和驅動表雜湊桶進行匹配,這個過程叫探測(probe)。
a外連線(
left/right/full outer join)
b內連線(inner join):顯示關聯上的2表都有的資訊,不像外連線偏向顯示某個表全部資料
c自連線
select c1.cno,c1.coursename,c1.pno,c2.coursename
from courses c1,courses c2 where c1.pno=c2.cno
d自然連線(natural join):指明了兩表進行自然連線,並且連線是基於兩表中所有同名字段的。
selectempno,ename,loc,deptno from emp natural join dept
注意:最好不要使用這種,因為當修改表結構的時候相關的sql也需要修改
e笛卡爾連線(cross join):a*b
f半連線(semi join or
anti join):
in 與 exists方式的關聯semi join,
類似nest loop方式,對主查詢每條記錄都執行一次子查詢,在執行計畫中叫做filter。
hint:
操作
nest loop
hash join
sort mereg
join
use_nl
use_hash
use_merge
anti join
nl_aj
hash_aj
merge_aj
semi
nl_sj
hash_sj
merge_sj
MySql資料庫連線種類
查詢分析器中執行 建表table1,table2 create table table1 id int,name varchar 10 create table table2 id int,score int insert into table1 select 1,lli insert into t...
c 連線Oracle庫整理
c 連線oracle庫整理 1.使用framework集連線 oracleclient 1.1 條件 安裝oracle客戶端 1.2 連線字串 建議使用1.2.2 否則在oracle 客戶端裡必須要做配置 1.3 注意 system.data.oracleclient.oracleconnectio...
SQL多表連線 的種類
多表連線的種類 根據結果集生成的規則不同,連線可以分為 交叉連線 內連線內連線原理 一 t1表和t2表做內連線,連線條件為on t1.c1 t2.c2,假設t1表做驅動表,t2表做匹配表,記錄的匹配過程如下 從t1表中讀取第一條記錄r1,若它的c1值為1 根據該值到t2表中查詢匹配的記錄,即需要遍歷...