oracle中所謂表的連線,有兩種含義。一種是根據oracle內部的連線判斷方式區分的內部連線型別,這會影響到系統優化、資源占用等問題。另一種是基於查詢的方式,對兩張表之間建立聯絡,會影響到查詢的結果,這裡都寫一下。
一、oracle 中的表內部連線有 3類 :
1、巢狀迴圈連線( nested loops)
原理:掃瞄乙個表,每讀取驅動表的一條記錄,就根據索引去另乙個表裡面查詢,所有匹配記錄放在結果集中,然後再讀取驅動表的下一行。沒有索引一般就不會是 nested loops 。
條件:驅動表結果集不大,被驅動表連線欄位要有索引。
特點:使用巢狀迴圈連線是從連線結果中提取第一批記錄的最快速方法。
使用: use_nl(t1 t2) 提示來強制執行 nested loops 。
2、雜湊連線( hash join)
原理:優化器先掃瞄小表,根據連線鍵在記憶體中建立 hash 表,然後掃瞄大表,每得到一條記錄就探測 hash 表一次,找出匹配行。
條件:兩個巨大表之間的連線,或乙個巨大的表乙個小表之間的連線。且連線鍵無索引。
特點:需要較大的記憶體,如錶太大則需要進行分割槽,並暫時儲存至磁碟的臨時段。掃瞄成本 = 全表掃瞄大表 + 分割槽數 * 表全表掃瞄小表;還需要注意的是:必須將 hash_join_enabled 設為 true, 並且為引數 pga_aggregate_target 設定了乙個足夠大的值後,才可以執行 hash join 。
使用: use_hash(t1 t2) 提示來強制執行 hash join
3、排序合併連線( sort merge join)
原理:將兩個表分別進行排序,然後將兩個表合併,查詢出匹配的記錄。
條件:行源已經被排過序的情況下使用。
特點:主要花費在兩個表的全表掃瞄和各自的排序上。
使用: use_merge(t1 t2) 提示來強制執行 sort merge join 。
總結:當缺少有用的索引時,雜湊連線比巢狀迴圈連線更加有效。雜湊連線可能比排序合併連線更快,因為在這種情況下只有一張源表需要排序。雜湊連線也可能比巢狀迴圈連線更快,因為處理記憶體中的雜湊錶比檢索 b_tree 索引更加迅速。
二、oracle外部連線方式也分3類:
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、內連線(inner join)
sql> select c1,c2,d1,d2 from t11 inner join t22 on t11.c1=t22.d1;
等效於:(可簡寫為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;
等效於:(可簡寫為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;
等效於:(可簡寫為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
等效於:(可簡寫為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.
Oracle中表連線的執行原理
oracle優化器會自動選擇以下三種方式的一種執行表連線,但在資料環境上配合強化選擇合適的方式或強制使用某種方式是sql優化的需要 nested loop 對於被連線的資料子集較小的情況,nested loop連線是個較好的選擇。nested loop就是掃瞄乙個表,每讀到一條記錄,就根據索引去另乙...
Oracle中表連線的執行原理
oracle優化器會自動選擇以下三種方式的一種執行表連線,但在資料環境上配合強化選擇合適的方式或強制使用某種方式是sql優化的需要 nested loop 對於被連線的資料子集較小的情況,nested loop連線是個較好的選擇。nested loop就是掃瞄乙個表,每讀到一條記錄,就根據索引去另乙...
SQL中表的連線,LINQTOSQL中表的連線
表的連線分為,內連線與外連線。外連線分為左外連線,右外連線。左連線是已左邊表中的資料為基準,若左表有資料右表沒有資料,則顯示左表中的資料右表中的資料顯示為空 sql 內連線 select from a,b where a.aid b.aid a,b表連線,a,b中均有的資料才顯示 左外連線 sele...