一、Oracle
中的表內(nèi)部連接有
3類(lèi)
:
?
1、
嵌套循環(huán)連接(
Nested Loops
)
原理
:掃描一個(gè)表,每讀取驅(qū)動(dòng)表的一條記錄,就根據(jù)索引去另一個(gè)表里面查找,所有匹配記錄放在結(jié)果集中,然后再讀取驅(qū)動(dòng)表的下一行。沒(méi)有索引一般就不會(huì)是
nested loops
。
條件
:驅(qū)動(dòng)表結(jié)果集不大,被驅(qū)動(dòng)表連接字段要有索引。
特點(diǎn)
:使用嵌套循環(huán)連接是從連接結(jié)果中提取第一批記錄的最快速方法。
使用
:
USE_NL(t1 t2)
提示來(lái)強(qiáng)制執(zhí)行
Nested Loops
。
?
2、
哈希連接(
Hash Join
)
原理
:優(yōu)化器先掃描小表,根據(jù)連接鍵在內(nèi)存中建立
hash
表,然后掃描大表,每得到一條記錄就探測(cè)
hash
表一次,找出匹配行。
條件
:兩個(gè)巨大表之間的連接,或一個(gè)巨大的表一個(gè)小表之間的連接。切連接鍵無(wú)索引。
特點(diǎn)
:需要較大的內(nèi)存,如表太大則需要進(jìn)行分區(qū),并暫時(shí)存儲(chǔ)至磁盤(pán)的臨時(shí)段。掃描成本
=
全表掃描大表
+
分區(qū)數(shù)
*
表全表掃描小表;還需要注意的是:必須將
HASH_JOIN_ENABLED
設(shè)為
True,
并且為參數(shù)
PGA_AGGREGATE_TARGET
設(shè)置了一個(gè)足夠大的值后,才可以執(zhí)行
Hash Join
。
使用
:
USE_HASH(t1 t2)
提示來(lái)強(qiáng)制執(zhí)行
Hash Join
?
3、
排序合并連接(
Sort Merge Join
)
原理
:將兩個(gè)表分別進(jìn)行排序,然后將兩個(gè)表合并,查找出匹配的記錄。
條件
:行源已經(jīng)被排過(guò)序的情況下使用。
特點(diǎn)
:主要花費(fèi)在兩個(gè)表的全表掃描和各自的排序上。
使用
:
USE_MERGE(t1 t2)
提示來(lái)強(qiáng)制執(zhí)行
Sort Merge Join
。
?
?
總結(jié)
:當(dāng)缺少有用的索引時(shí),哈希連接比嵌套循環(huán)連接更加有效。哈希連接可能比排序合并連接更快,因?yàn)樵谶@種情況下只有一張?jiān)幢硇枰判颉9_B接也可能比嵌套循環(huán)連接更快,因?yàn)樘幚韮?nèi)存中的哈希表比檢索
B_Tree
索引更加迅速。
?
?
?
二、Oracle外部連接方式也分3類(lèi):
?
??? SQL> select * from t11;
??????????? C1???????? C2
??? ---------- ----------
???????????? 5????????? 5
???????????? 1????????? 1
???????????? 2????????? 2
??? SQL> select * from t22;
??????????? D1???????? D2
??? ---------- ----------
???????????? 1????????? 1
???????????? 2????????? 2
???????????? 3????????? 3
???????????? 4????????? 4
?
1、內(nèi)連接(inner join)
??? SQL> select c1,c2,d1,d2 from t11 inner join t22 on t11.c1=t22.d1;
??? 等效于:(可簡(jiǎn)寫(xiě)為join)
??? SQL> select c1,c2,d1,d2 from t11,t22 where t11.c1=t22.d1;
???
效果:
??????????? C1???????? C2???????? D1???????? D2
??? ---------- ---------- ---------- ----------
???????????? 1????????? 1????????? 1????????? 1
???????????? 2????????? 2????????? 2????????? 2
?
2、外連接(outer join)
?
?
①左外連接
??? SQL> select c1,c2,d1,d2 from t11 left outer join t22 on t11.c1=t22.d1;
??? 等效于:(可簡(jiǎn)寫(xiě)為left?join)
??? SQL> select c1,c2,d1,d2 from t11,t22 where t11.c1=t22.d1(+);
???
效果:
??????????? C1???????? C2???????? D1???????? D2
??? ---------- ---------- ---------- ----------
???????????? 5????????? 5
???????????? 1????????? 1????????? 1????????? 1
???????????? 2????????? 2????????? 2????????? 2
?
②右外連接
??? SQL> select c1,c2,d1,d2 from t11 right outer join t22 on t11.c1=t22.d1;
??? 等效于:(可簡(jiǎn)寫(xiě)為right?join)
??? SQL> select c1,c2,d1,d2 from t11,t22 where t11.c1(+)=t22.d1;
???
效果:
??????????? C1???????? C2???????? D1???????? D2
??? ---------- ---------- ---------- ----------
???????????? 1????????? 1????????? 1????????? 1
???????????? 2????????? 2????????? 2????????? 2
?????????????????????????????????? 4????????? 4
?????????????????????????????????? 3????????? 3
?
③全外連接
??? SQL> select c1,c2,d1,d2 from t11 full outer join t22 on t11.c1=t22.d1;
???
效果:
??????????? C1???????? C2???????? D1???????? D2
??? ---------- ---------- ---------- ----------
???????????? 5????????? 5
???????????? 1????????? 1????????? 1????????? 1
???????????? 2????????? 2????????? 2????????? 2
?????????????????????????????????? 4????????? 4
?????????????????????????????????? 3????????? 3
??? 等效于:(可簡(jiǎn)寫(xiě)為full?join)
??? SQL> select c1,c2,d1,d2 from t11,t22 where t11.c1=t22.d1(+)
????? 2? union
????? 3? select c1,c2,d1,d2 from t11,t22 where t11.c1(+)=t22.d1;
?
3、交叉連接(cross join)
??? SQL> select c1,c2,d1,d2 from t11 cross join t22;
??? 等效于:(其他join必須有on子句)
??? SQL> select c1,c2,d1,d2 from t11,t22;
???
效果:
??????????? C1???????? C2???????? D1???????? D2
??? ---------- ---------- ---------- ----------
???????????? 5????????? 5????????? 1????????? 1
???????????? 5????????? 5????????? 2????????? 2
???????????? 5????????? 5????????? 3????????? 3
???????????? 5????????? 5????????? 4????????? 4
???????????? 1????????? 1????????? 1????????? 1
???????????? 1????????? 1????????? 2????????? 2
???????????? 1????????? 1????????? 3????????? 3
???????????? 1????????? 1????????? 4????????? 4
???????????? 2????????? 2????????? 1????????? 1
???????????? 2????????? 2????????? 2????????? 2
???????????? 2????????? 2????????? 3????????? 3
???????????? 2????????? 2????????? 4????????? 4
??? 12 rows selected.
?
?
?
?
?
?